我想将非托管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
答案 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
。
答案 1 :(得分:2)
您的"无效令牌"编译器错误是由DllImport属性之后的分号引起的。此外,您还要指定一个逐字的@" ..."带有双反斜杠的字符串。我认为你的声明应该是这样的:
[DllImport(@"..\lib\DDS_Service.dll", EntryPoint="SetCallback")]
private static extern void SetCallback(Callback fn);
如果您的DLL是COM dll,那么您可以运行regsvr32来注册它,并在项目中添加对它的引用。如果是这样,那么您就不需要使用P / Invoke:您可以像任何其他库一样引用它。