2012-03-20 2 views
1

У меня есть собственная/неуправляемая DLL, и у нее есть функция «CreateObject», которая возвращает указатель на бизнес-объект .. поэтому вызов будет sth. как:P/Invoke from C#: функции вызова возвращаемого объекта

[DllImport("MyDll.dll", CharSet = CharSet.Auto)] 
private static extern IntPtr CreateObject(); 

Вопрос: Объект воздействия Государственно-функции, такие как «Connect()», который я хочу позвонить, но я не знаю, как «карта» эти вызовы, так что у меня есть простой метод -сигналы:

private bool Connect(); 

Любые идеи?

ответ

6

Способ сделать это, чтобы обеспечить другую функцию PInvoke, которая вызывает в функцию C, которая делает вызов метода

[DllImport("MyDll.dll", CharSet = CharSet.Auto)] 
[return: MarshalAs(UnmanagedType.I1)] 
private static extern bool Connect(IntPtr businessObject); 

Тогда в C вы определяете следующее

extern "C" { 
    bool Connect(Business* pObject) { 
    return pObject->Connect(); 
    } 
} 
+0

Вы также хотите, чтобы соглашения о вызовах совпадали. –

0

Вы должны оберните объекты C++ в свободные функции:

bool Connect(MyObject* obj) 
{ 
    return obj->Connect(); 
} 

, а затем экспортировать их из вашей DLL.

В качестве альтернативы вы можете использовать тот факт, что вы компилируете с C++/CLI и экспортируете управляемый класс C++/CLI, который может быть использован непосредственно вашим кодом C#.

Смежные вопросы