Используете предварительно скомпилированную сборку .NET DLL в Mono? - PullRequest
13 голосов
/ 21 июля 2009

В настоящее время мы тестируем Mono, чтобы выяснить, будут ли наши .NET DLL работать для клиентов в Linux. Наши библиотеки DLL предоставляют компоненты для Windows Forms. Я поместил библиотеки DLL в каталог Debug, добавил ссылки и создал класс, производный от формы Windows. Класс работал нормально автономно, но после того как я добавил ссылки на DLL и создал один из наших компонентов (intellisense работал нормально), он компилируется, но не запускается:

** (/home/aldwin/testMonoWF/testMonoWF/bin/Debug/testMonoWF.exe:26905): WARNING **: Could not load file or assembly 'OUR.ASSEMBLY, Version=1.0.0.1, Culture=neutral, PublicKeyToken=ATOKEN' or one of its dependencies.

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'OUR.ASSEMBLY, Version=1.0.0.1, Culture=neutral, PublicKeyToken=ATOKEN' or one of its dependencies.
File name: 'OUR.ASSEMBLY, Version=1.0.0.1, Culture=neutral, PublicKeyToken=ATOKEN'

Я посмотрел на свойства сборки, и это та версия с этим открытым ключом.

Можно ли мне использовать эти библиотеки DLL? Что я делаю не так?

EDIT:

Согласно MoMA, кроме некоторых [MonoTodo], которые не имеют отношения к ситуации, в трех DLL есть одна проблема:

Calling Method | P/Invoke Method | P/Invoke Library
void OnHandleCreated (EventArgs) | int GoText/ComboBoxControl.SetWindowTheme (IntPtr, string, string) | uxtheme.dll

Однако я открыл один из наших примеров проектов, созданных с помощью VS2008, указал ссылку на DLL в нужном месте, и она работала нормально. Но я не смог получить ссылку на работу в новом проекте. Я что-то не так делаю?

РЕДАКТИРОВАТЬ 2: Чтобы уточнить, мы не хотим воссоздать существующее приложение Windows - мы моделируем клиента, создающего новое приложение с нашей DLL. Я только проверял это, чтобы видеть, была ли это проблема dll. Поскольку приложение, созданное VS, смогло найти dll и успешно работать, казалось бы, это не проблема dll. Новое приложение не вызывает ничего, что не создает приложение, созданное VS.

Ответы [ 5 ]

9 голосов
/ 21 июля 2009

Я бы протестировал DLL с помощью MOMA (Mono Migration Analyzer) , чтобы проверить, использует ли он неподдерживаемые API.

6 голосов
/ 22 июля 2009

То, что сказал Джонатан, верно, вам нужно выполнить команду, как показано, и она выдаст большое количество информации.

Сборка имеет строгое имя, поэтому, похоже, в Windows у вас есть зависимость, которая установлена ​​в GAC. Если «OUR.ASSEMBLY» должен быть там, запустите:

gacutil -i OUR.ASSEMBLY.dll

Чтобы установить его. Могут быть и другие зависимости, которые нужны OUR.ASSEMBLY.dll, и это то, что показывает команда JPobst.

4 голосов
/ 22 июля 2009

Вероятные проблемы заключаются в том, что сборка не помещается в тот же каталог, что и программа, или что чувствительность к регистру имени файла сборки не сохраняется при копировании. Например, у вас может быть ссылка OUR.ASSEMLY, но имя файла - OurAssembly.DlL или любая другая недопустимая комбинация регистра, с которой могут столкнуться люди.

4 голосов
/ 22 июля 2009

Как правило, вы можете получить более подробную информацию об ошибках загрузки DLL, запустив команду:

MONO_LOG_LEVEL = "debug" MONO_LOG_MASK = "dll" mono myapp.exe

1 голос
/ 23 декабря 2012

uxtheme.dll - движок тем Windows, если я не ошибаюсь. Вполне естественно, что в среде, отличной от Windows, ее нет, поэтому P / Invoking ее экспортируемых функций напрямую невозможен.

У вас есть два варианта:

  1. Откройте этот метод OnHandleCreated и замените вызов SetWindowTheme чем-нибудь переносимым или
  2. Создайте пустышку libuxtheme.so, которая содержит только эту одну функцию, чтобы моно мог P / Invoke его.

Я рекомендую первый подход, если это возможно, поскольку вам нужно будет создать этот макет libuxtheme.so для каждой платформы, которую вы поддерживаете. То есть вам нужно было бы сделать libuxtheme.so для Linux x86, libuxtheme.so для Linux x86_64, то же самое для FreeBSD, libuxtheme.dylib для Mac OS X и т. Д.

Если OnHandleCreated был сгенерирован каким-либо дизайнером пользовательского интерфейса или чем-то подобным, вам, вероятно, придется удалить некоторые темы виджетов, чтобы избавиться от вызова.

...