Visual Studio 2010中的dll导出/导入问题

时间:2010-07-11 21:44:27

标签: c# .net c++ dll dllimport

我写了一个visual c ++ win32控制台应用程序,我写了它并在

中测试了它
  

win32控制台项目

。然后我切换到

  

win32项目

并导入所有源文件并为其创建一个dll。通过标记我要导出的类

#define DllExport   __declspec( dllexport )

class DllExport theClass {
} 

它可以工作并生成dll。然后我创建了另一个c#项目,并希望将dll添加到项目中。通过引用 - >添加引用 - >浏览器。然后我选择那个DLL。   然后它给了我一个错误

  

对''''''的引用.dll可以   不加。请确保   该文件是可访问的,这是一个   有效的汇编或com组件。

有谁知道我在哪里做错了生成/导入dll?

感谢

1 个答案:

答案 0 :(得分:5)

“添加引用”对话框仅适用于包含元数据(托管代码)或类型库(COM服务器)的DLL。您的DLL不适合该帐单,您只能使用C#代码中的[DllImport]属性来使用P / Invoke编组程序来调用非托管DLL入口点。

那可能是本机C ++类,就像你想要做的那样,托管代码没有可靠的机制来分配非托管内存并调用本机C ++的构造函数(和析构函数)类。由于难以找到构造函数和析构函数代码,P / Invoke编组器无法知道对象的大小。 C ++语言不会生成知道此必需信息所需的元数据。

如果你想追求P / Invoke,那么写一个普通的全局函数,用extern“C”,__ declspec(dllexport)和(可选)__stdcall来装饰。

如果要导出C ++类,那么唯一的途径是使用C ++ / CLI语言并为本机C ++类编写“ref class”包装器。

或者你可以写一个COM coclass,Windows中的通用粘合剂。非常好的.NET支持,如果你之前从未编写过COM代码,可能不是你想要追求的东西。 ATL是获得一个人的最好方式。