Как определить неуправляемую зависимость dll в C#

#c# #pinvoke #unmanaged

#c# #пинвоук #неуправляемая

Вопрос:

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

 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.h:

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

и библиотеки DLL C 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
 

Комментарии:

1. В частности, ошибка, которую я получаю, когда пытаюсь сопоставить ссылку на DLL с проектом C #: «Не удалось добавить ссылку на dll. Пожалуйста, убедитесь, что файл доступен и что он является допустимой сборкой или компонентом COM «.

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

Ответ №1:

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

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

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

Ответ №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 атрибута.