2015-04-19 2 views
1

Я пытаюсь перенести приложение 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

+1

Просто одна вещь, которая выделяется - это определенно означало быть BOOL *? – JamesSugrue

+0

Это то, что он генерировал автоматически, но я думаю, что это неправильно. По-видимому, вы, вероятно, будете делать ручную настройку. –

+0

Я включил оригинальный класс для ясности –

ответ

0

Я начал сомневаться в bmac.exe все больше и больше, и я наконец установил пробную версию Xamarin.Mac. Это можно получить здесь: http://forums.xamarin.com/discussion/31680/welcome-to-the-xamarin-mac-forums-and-faq#latest, но это может измениться в будущем. Это также содержало родную версию bmac (без расширения .exe), и это уже делалось в первый раз, когда я пытался. С немного регулировки я получил этот призыв, и что породило .dll:

/Library/Frameworks/Xamarin.Mac.framework/Versions/1.10.0.18/bin/bmac -o Simple.dll --tmpdir=. \ 
-baselib=/Library/Frameworks/Xamarin.Mac.framework/Versions/1.10.0.18/lib/mono/XamMac.dll \ 
-r=System.Drawing.dll ApiDefinitions.cs -v -unsafe -target:library 

Это был .cs файл я в конечном итоге с помощью:

using System; 
using System.Drawing; 
using MonoMac.Foundation; 

namespace OPN200x 
{ 
    // @interface SimpleClass : NSObject 
    [BaseType (typeof(NSObject))] 
    interface SimpleClass 
    { 
     // -(NSString *)run; 
     [Export ("run")] 
     string Run { get; } 
    } 
} 

Когда я запустить приложение и создать экземпляр класса я сталкиваюсь ошибку:

Could not create an native instance of the type 'OPN200x.SimpleClass': the native class hasn't been loaded. 
It is possible to ignore this condition by setting MonoMac.ObjCRuntime.Class.ThrowOnInitFailure to false. 

Я не уверен, что это связано с, но я думаю, что путь BMAC работал отлично.

0

bmac сейчас строит хорошую DLL. Просто отсутствует загрузочная среда в приложении MonoMac до запуска любого экземпляра этой библиотеки.

if (Dlfcn.dlopen("PathToFrameworksFolder/Simple.framework/Simple", 0) == IntPtr.Zero) 
{ 
Console.Error.WriteLine("Unable to load the dynamic library."); 
} 

Просто вернитесь к: http://brendanzagaeski.appspot.com/xamarin/0002.html и увидеть в нижней части этого блога, код класса MainClass