mkbundle и GTK#

Я пытаюсь использовать mkbundle, чтобы я мог распространять приложение GTK# без необходимости установки.NET/Mono или GTK# пользователями. Я успешно связал приложение, которое использует winforms, но по какой-то причине, когда я делаю то же самое с приложением GTK#, оно не будет работать.

Это то, что я получаю из Cygwin:

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

Необработанное исключение: System.IO.FileNotFoundException: Не удалось загрузить файл или сборку 'gtk-sharp' или одну из ее зависимостей. Система не может найти указанный файл.
Имя файла: 'gtk-sharp'
в System.AppDomain.Load (System.Reflection.AssemblyName assemblyRef, System.Security.Policy.Evidence assemblySecurity) [0x00000] в: 0
at (обертка удаленного взаимодействия с проверкой) System.AppDomain:Load (System.Reflection.AssemblyName,System.Security.Policy.Evidence)
в System.AppDomain.Load (System.Reflection.AssemblyName assemblyRef) [0x00000] в: 0
at (обертка remoting-invoke-with-check) System.AppDomain:Load (System.Reflection.AssemblyName)
в System.Reflection.Assembly.Load (System.Reflection.AssemblyName assemblyRef) [0x00000] в: 0
в MakeBundle.QueueAssembly (файлы System.Collections.ArrayList, кодовая база System.String) [0x00000] в: 0
в MakeBundle.Main (System.String[] args) [0x00000] в: 0
[ERROR] FATAL UNHANDLED EXCEPTION: System.IO.FileNotFoundException: Не удалось загрузить файл или сборку 'gtk-sharp' или одну из ее зависимостей. Система не может найти указанный файл.
Имя файла: 'gtk-sharp'
в System.AppDomain.Load (System.Reflection.AssemblyName assemblyRef, System.Security.Policy.Evidence assemblySecurity) [0x00000] в: 0
at (обертка удаленного взаимодействия с проверкой) System.AppDomain:Load (System.Reflection.AssemblyName,System.Security.Policy.Evidence)
в System.AppDomain.Load (System.Reflection.AssemblyName assemblyRef) [0x00000] в: 0
at (обертка remoting-invoke-with-check) System.AppDomain:Load (System.Reflection.AssemblyName)
в System.Reflection.Assembly.Load (System.Reflection.AssemblyName assemblyRef) [0x00000] в: 0
в MakeBundle.QueueAssembly (файлы System.Collections.ArrayList, кодовая база System.String) [0x00000] в: 0
в MakeBundle.Main (System.String[] args) [0x00000] в:0`

Но все же у меня есть /cygdrive/c/GtkSharp/2.12/lib в моей переменной PATH. Я могу проверить это, как будто я набираю "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

Так что он должен быть в состоянии найти файл!

Любая помощь приветствуется.

2 ответа

Решение

Я нашел скрипт оболочки, который делает все это, и изменил его до последних версий, по состоянию на май 2013 года вы можете просто использовать скрипт следующим образом:

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

1.) Установите cygwin и убедитесь, что вы выбрали следующие пакеты: - gcc-mingw - pkg-config - mingw-zlib1 - mingw-zlib-devel

2.) Установите пакет выпуска Mono: "Mono для Windows, Gtk# и XSP"

3.) Загрузите скрипт, поместите его помимо вашего Приложения и измените его в соответствии с вашей средой (внимательно прочитайте комментарии в файле).

4.) Откройте cygwin и перейдите к выходной папке вашего приложения, где находится исполняемый файл и сценарий, например, YourProject / bin / Release

5.) Выполните скрипт с помощью команды: ./mkbundle_cygwin.sh

Устранение неполадок: если ваш встроенный исполняемый файл не работает, убедитесь, что исходное приложение.NET работает в режиме моно. Вы можете проверить это, вызвав файл mono.exe и передав ему приложение.NET, или установив XamarinStudio и запустив оттуда свой проект (установите моно в качестве среды выполнения).

Хорошо, я не знаю, является ли это реальным решением, но я просто скопировал сборки из C: \ GtkSharp \ 2.12 \ lib \ gtk-sharp-2.0 в C: \ Mono-2.10.5 \ lib \ mono \ 4.0 и Теперь кажется, что все в порядке, используя следующие шаги:

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

Это сработало для меня. Хотя мне также для некоторых вещей нужно было скопировать machine.config из C: \ Mono-2.10.5 \ etc \ mono \ 4.0 в каталог, где находится мое приложение, и передать --machine-config machine.config в mkbundle.

Другие вопросы по тегам