0

ユーザーが .NET/Mono または GTK# をインストールしなくても GTK# アプリケーションを配布できるように、mkbundle を使用しようとしています。winforms を使用するアプリケーションをバンドルすることに成功しましたが、GTK# アプリケーションで同じことを行うと、何らかの理由で機能しません。

これは私がcygwinから得たものです:

$ mkbundle --deps a.exe OS is: Windows Sources: 1 Auto-dependencies: True

未処理の例外: System.IO.FileNotFoundException: ファイルまたはアセンブリ 'gtk-sharp' またはその依存関係の 1 つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。
ファイル名: 'gtk-sharp'
at System.AppDomain.Load (System.Reflection.AssemblyName assemblyRef, System.Security.Policy.Evidence assemblySecurity) [0x00000] in :0
at (wrapper remoting-invoke-with-check) System. AppDomain:Load (System.Reflection.AssemblyName,System.Security.Policy.Evidence)
at System.AppDomain.Load (System.Reflection.AssemblyName assemblyRef) [0x00000] in :0
at (wrapper remoting-invoke-with-check) システム.AppDomain:Load (System.Reflection.AssemblyName)
at System.Reflection.Assembly.Load (System.Reflection.AssemblyName assemblyRef) [0x00000] in :0
MakeBundle.QueueAssembly (System.Collections.ArrayList ファイル、System.String コードベース) [0x00000] で:0
MakeBundle.Main (System.String[] args) [0x00000] で:0
[エラー] 致命的な未処理の例外: システム。 IO.FileNotFoundException: ファイルまたはアセンブリ 'gtk-sharp' またはその依存関係の 1 つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。
ファイル名: 'gtk-sharp'
at System.AppDomain.Load (System.Reflection.AssemblyName assemblyRef, System.Security.Policy.Evidence assemblySecurity) [0x00000] in :0
at (wrapper remoting-invoke-with-check) System. AppDomain:Load (System.Reflection.AssemblyName,System.Security.Policy.Evidence)
at System.AppDomain.Load (System.Reflection.AssemblyName assemblyRef) [0x00000] in :0
at (wrapper remoting-invoke-with-check) System.AppDomain:Load (System.Reflection.AssemblyName)
at System.Reflection.Assembly.Load (System.Reflection.AssemblyName assemblyRef) [0x00000] in :0
at MakeBundle.QueueAssembly ( System.Collections.ArrayList ファイル、System.String コードベース) [0x00000] in :0
MakeBundle.Main (System.String[] args) [0x00000] in :0`

しかし、まだ PATH 変数に /cygdrive/c/GtkSharp/2.12/lib があります。これを確認できます。cygwin に「gtk-sharp.dll」と入力すると、次の結果が返されます。

$ gtk-sharp.dll bash: /cygdrive/c/GtkSharp/2.12/lib/gtk-sharp-2.0/gtk-sharp.dll: cannot execute binary file

したがって、ファイルを見つけることができるはずです。

どんな助けでも大歓迎です。

4

2 に答える 2

1

これが本当の解決策かどうかはわかりませんが、アセンブリを C:\GtkSharp\2.12\lib\gtk-sharp-2.0 から C:\Mono-2.10.5\lib\mono\4.0 にコピーして、次の手順を使用して、OK をバンドルするようになりました。

mkbundle -c -o host.c -oo bundle.o --deps app.exe

nano host.c

以下から変更します。

#ifdef _WIN32
#include <windows.h>
#endif`

#ifdef _WIN32
#include <windows.h>
#endif
#undef _WIN32

そして最後に:

gcc -mno-cygwin -o bundled.exe -Wall host.c `pkg-config --cflags --libs mono-2|dos2unix` bundle.o

それは私のために働いた。また、C:\Mono-2.10.5\etc\mono\4.0 から machine.config をアプリケーションのあるディレクトリにコピーし、--machine-config machine.config を mkbundle に渡す必要がありました。

于 2011-09-06T16:09:55.467 に答える
1

これらすべてを実行するシェルスクリプトを見つけて最新バージョンに変更しました.2013年5月現在、次のようにスクリプトを使用できます。

https://gist.github.com/tebjan/5581296

1.) cygwin をインストールし、次のパッケージを選択していることを確認します: - gcc-mingw - pkg-config - mingw-zlib1 - mingw-zlib-devel

2.) Mono リリース パッケージをインストールします: "Mono for Windows, Gtk#, and XSP"

3.) スクリプトをダウンロードして、アプリケーションの横に配置し、環境に合わせて変更します (ファイル内のコメントを注意深く読んでください)。

4.) cygwin を開き、ececutable と scipt があるアプリケーションの出力フォルダー (例: YourProject/bin/Release) に移動します。

5.) 次のコマンドでスクリプトを実行します: ./mkbundle_cygwin.sh

トラブルシューティング: バンドルされている実行可能ファイルが機能しない場合は、元の .NET アプリケーションが mono 上で機能することを確認してください。mono.exe を呼び出して .NET アプリを渡すか、XamarinStudio をインストールしてそこからプロジェクトを実行することでテストできます (mono をランタイムとして設定します)。

于 2013-05-15T03:23:27.483 に答える