質問
Mkbundleを使用して、ユーザーが.NET/MONOまたはGTK#をインストールする必要なくGTK#アプリケーションを配布できるようにしようとしています。 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(lapper remoting-invoke-with-check)system.appdomain:load(system.reflection.assemblyname)
System.Reflection.Assembly.Load(System.Reflection.AssemblyName AssemblyRef)[0x00000] In:0
MakeBundle.QueueAssembly(System.Collections.ArrayList Files、System.String CodeBase)[0x00000] in:0
MakeBundle.Main(System.String [] args)[0x00000] in:0
エラー]致命的な未処理の例外: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(lapper remoting-invoke-with-check)system.appdomain:load(system.reflection.assemblyname)
System.Reflection.Assembly.Load(System.Reflection.AssemblyName AssemblyRef)[0x00000] In:0
MakeBundle.QueueAssembly(System.Collections.ArrayList Files、System.String CodeBase)[0x00000] in:0
at makebundle.main(system.string [] args)[0x00000] in:0`
しかし、私はパス変数に/cygdrive/c/gtksharp/2.12/libを持っています。 「GTK-Sharp.dll」をCygwinに入力するかのように、これを確認できます。
$ gtk-sharp.dll
bash: /cygdrive/c/GtkSharp/2.12/lib/gtk-sharp-2.0/gtk-sharp.dll: cannot execute binary file
ファイルを見つけることができるはずです!
どんな助けも大歓迎です。
解決
これをすべて行うシェルスクリプトを見つけて、最新のバージョンに変更しました。2013年5月の時点で、次のようにスクリプトを使用できます。
https://gist.github.com/tebjan/5581296
1.)Cygwinをインストールし、次のパッケージを選択してください:-GCC-MINGW-PKG-CONFIG-MINGW-ZLIB1-MINGW-ZLIB-DEVEL
2.)モノリリースパッケージをインストール:「Windows、GTK#、XSP用のモノー」
3.)アプリケーション以外にスクリプトの配置をダウンロードし、環境に合うように変更します(ファイルのコメントを注意深くお読みください)。
4.)Cygwinを開いて、EceCutableとSciptがあるアプリケーションの出力フォルダーに移動します。たとえば、Project/Bin/リリース
5.)コマンドでスクリプトを実行します:./mkbundle_cygwin.sh
トラブルシューティング:バンドルされた実行可能ファイルが機能しない場合は、元の.NETアプリケーションがMonoで機能することを確認してください。 Mono.exeを呼び出して.NETアプリを渡すか、XamarinStudioをインストールしてそこからプロジェクトを実行することでテストできます(モノをランタイムとして設定します)。
他のヒント
これが本当の解決策であるかどうかはわかりませんが、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に渡します。