如何在C#中定义非托管dll依赖项

本文关键字:dll 依赖 定义 | 更新日期: 2023-09-27 18:10:44

我想将非托管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的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

如何在C#中定义非托管dll依赖项

您的"无效令牌"编译器错误是由于DllImport属性后面的分号引起的。此外,您指定了一个逐字逐句的@"…"字符串,其中包含双反斜杠。我认为您的声明应该看起来像:

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

如果你的DLL是COM DLL,那么你可以运行regsvr32来注册它,并在你的项目中添加对它的引用。如果是这种情况,那么您就不需要使用P/Invoke:您可以像引用任何其他库一样引用它。

 [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属性后面的行中的;