Я пытаюсь перенести приложение Windows Forms в MacOS X, используя собственный интерфейс (.xibs). Это приложение должно получить доступ к аппаратным устройствам с драйверами MacOS X, но я хочу, чтобы логика C# уже была написана для версии Windows, поэтому было бы проще обновить приложение в будущем. Я создал небольшой проект Xcode, чтобы проверить, как получить доступ к этому устройству, и я получил его на работу, затем я перевернул его в .framework и попытался использовать его в проекте MonoMac. Это оказалось немного сложнее.Преобразование собственной библиотеки MacOS X в dll с помощью MonoMac
Я в основном следовал следующему руководству, чтобы выяснить, какие шаги следует предпринять, когда я также скопировал код примера, чтобы убедиться, что я не сталкиваюсь со всеми проблемами зависимости, потому что созданная мной фреймворк немного более сложным и выполнили все шаги по созданию базы i386 (по совпадению мне нужно скомпилировать мой водитель так же, потому что это довольно старая ...) называется просто:
http://brendanzagaeski.appspot.com/xamarin/0002.html
это очень простой класс, выглядит следующим образом:
@implementation Simple
- (NSString *)run:(BOOL *)successful
{
*successful = YES;
return @"OK";
}
@end
Я выполнил все шаги без каких-либо проблем вплоть до того, как подробно описал, как использовать sharpie, потому что это изменилось на инструмент командной строки с разными параметрами. Я в конечном итоге генерации .cs файлы, используя следующую команду вместо:
sharpie bind -sdk macosx10.10 -framework Simple.framework -classic -v -c -arch i386
ApiDefinitions.cs выглядит следующим образом:
using MonoMac.Foundation;
//[Verify (ConstantsInterfaceAssociation)]
partial interface Constants
{
// extern double SimpleVersionNumber;
[Field ("SimpleVersionNumber")]
double SimpleVersionNumber { get; }
// extern const unsigned char [] SimpleVersionString;
[Field ("SimpleVersionString")]
byte[] SimpleVersionString { get; }
}
// @interface Simple : NSObject
[BaseType (typeof(NSObject))]
interface Simple
{
// -(NSString *)run:(BOOL *)successful;
[Export ("run:")]
unsafe string Run (bool* successful);
}
-classic переключатель дал мне правильно используя (MonoMac.Foundation) немедленно поэтому я доверял этому больше, но я тоже пробовал. Выход, кроме использования, был идентичным в противном случае.
Я прокомментировал часть проверки, так как это не компилируется и предназначено для предупреждения людей, использующих остроумие, что что-то может потребоваться для проверки. Я также изменил bool * успешно, чтобы подтвердить bool в соответствии с учебником.
Тогда мне нужен был bmac. Этот инструмент существует только в Xamarin.Mac, и если вы хотите использовать его на MacMono, вам сначала нужно скомпилировать MacMono вручную и вместо этого использовать сгенерированный файл bmac.exe. В руководстве используется следующая команда:
/Library/Frameworks/Xamarin.Mac.framework/Versions/Current/usr/bin/bmac -oSimple.dll --tmpdir=/tmp -baselib=/Library/Frameworks/Xamarin.Mac.framework/Versions/Current/usr/lib/mono/XamMac.dll -r=System.Drawing SimpleBindingDefinition.cs
Я изменил это следующей командой:
mono /Users/Name/Code/monomac/monomac/src/bmac.exe -o Simple.dll --tmpdir=/tmp -baselib=/Users/Name/Code/monomac/monomac/src/MonoMac.dll -r=System.Drawing ApiDefinitions.cs
Это генерируется следующее сообщение об ошибке:
in Method: System.String Run(Boolean*)
error BI0000: Unexpected error - Please file a bug report at http://bugzilla.xamarin.com
// and more
Справедливо, учебник уже предупредил об этом булевом рефлекторе, поэтому я изменил его на:
unsafe string Run (ref bool successful);
Теперь у меня осталось точно такая же ошибка преградить часть о булевы:
error BI0000: Unexpected error - Please file a bug report at http://bugzilla.xamarin.com
System.NullReferenceException: Object reference not set to an instance of an object
at Generator.Generate (System.Type type) [0x00000] in <filename unknown>:0
at Generator.Go() [0x00000] in <filename unknown>:0
at BindingTouch.Main2 (System.String[] args) [0x00000] in <filename unknown>:0
at BindingTouch.Main (System.String[] args) [0x00000] in <filename unknown>:0
Так что уверен, что он пытается обработать метод бежать, и натыкается где-то, но я не уверен, где фактическая проблема начинается. Является ли преобразование резкости неправильным уже или это то, как я изменил ApiDefinitions или вызвал bmac.exe?
Также попытался создать новую версию рамки без параметра bool ref и удалить эти два метода версии. Это ничего не изменило.
Я пытаюсь выяснить, возможно, это ошибка компиляции, когда она скомпилирована на месте. Протестировано: эта структура работает без заминки в обычном проекте Xcode
Просто одна вещь, которая выделяется - это определенно означало быть BOOL *? – JamesSugrue
Это то, что он генерировал автоматически, но я думаю, что это неправильно. По-видимому, вы, вероятно, будете делать ручную настройку. –
Я включил оригинальный класс для ясности –