2014-06-27 2 views
2

Я хочу связать неуправляемую библиотеку C++ с приложением C#. Я использую процесс PInvoke, потому что неуправляемая dll C++ имеет несколько зависимостей, которые не будут компилироваться с CLR. Когда я компилирую приведенный ниже пример кода, я получаю следующие ошибки. Я нашел ссылку, которую мне нужно добавить ссылку dll, но MSVS говорит мне, что не может ее добавить. Я также читал о регистрации его с помощью regsvr32, но это похоже на библиотеки CLR, так? Итак, мой вопрос: как мне очистить эту ошибку для неуправляемой dll?Как определить неуправляемую зависимость dll в C#

ServerTerminal.cs(62,48): error CS1031: Type expected 
ServerTerminal.cs(62,48): error CS1519: Invalid token ';' in class, struct, or interface member declaration 
ServerTerminal.cs(64,48): error CS1031: Type expected 
ServerTerminal.cs(64,48): error CS1519: Invalid token ';' in class, struct, or interface member declaration 

ServerTerminal.cs: 
    class ServerTerminal 
    { 
     private delegate int Callback(string text); 
     private Callback mInstance; 

     public ServerTerminal() 
     { 
      mInstance = new Callback(Handler); 
      SetCallback(mInstance); 
     } 

     public void Test() 
     { 
      TestCallback(); 
     } 

     private int Handler(string text) 
     { 
      return 0; 
     } 
     [DllImport(@"..\\lib\\DDS_Service.dll", EntryPoint="SetCallback")]; 
     private static extern void SetCallback(Callback fn); 
     [DllImport(@"..\\lib\\DDS_Service.dll", EntryPoint="TestCallback")]; 
     private static extern void TestCallback(); 
    } 

и C++ DLL в Component.h:

typedef int (__stdcall * Callback)(const char* text); 
Callback Handler=0; 
class COM_Component : public CM_Component 
{ 
    // Contents not pasted 
} 

и C++ DLL в Component.cpp:

extern "C" __declspec(dllexport) 
void __stdcall SetCallback(Callback handler) 
{ 
    Handler = handler; 
} 

extern "C" __declspec(dllexport) 
void __stdcall TestCallback() 
{ 
    int retval = Handler("hello world"); 
} 

COM_Component::COM_Component(void) : CM_Component(TDstring("COM_Component")) 
{ 
    // register the observer callback methods 
} 
// Remainder of file not pasted 
+0

В частности, ошибка, которую я получаю при попытке сопоставить ссылку на DLL с проектом C#: «Ссылка на dll не может быть добавлена. Убедитесь, что файл доступен, и что это действительная сборка или COM ". –

+0

Удалите точку с запятой после атрибута – erikkallen

ответ

2

Ошибки компилятора «недопустимый токен» связаны с точкой с запятой сразу после атрибутов DllImport. Кроме того, вы задаете строку verbatim @ "..." с двойными обратными косыми чертами в ней. Я думаю, что ваша декларация должна выглядеть следующим образом:

[DllImport(@"..\lib\DDS_Service.dll", EntryPoint="SetCallback")] 
    private static extern void SetCallback(Callback fn); 

Если ваша DLL является DLL COM, то вы можете запустить regsvr32, чтобы зарегистрировать его, и добавьте ссылку на него в проекте. Если это так, то вам не нужно использовать P/Invoke: вы могли бы ссылаться на него, как на любую другую библиотеку.

+0

Ах, вот и все - спасибо! –

2
[DllImport(@"..\\lib\\DDS_Service.dll", EntryPoint="SetCallback")]; 
private static extern void SetCallback(Callback fn); 
[DllImport(@"..\\lib\\DDS_Service.dll", EntryPoint="TestCallback")]; 
private static extern void TestCallback(); 

Вынуть ; в строках после атрибута DllImport.

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