我写了一个visual c ++ win32控制台应用程序,我写了它并在
中测试了它win32控制台项目
。然后我切换到
win32项目
并导入所有源文件并为其创建一个dll。通过标记我要导出的类
#define DllExport __declspec( dllexport )
class DllExport theClass {
}
它可以工作并生成dll。然后我创建了另一个c#项目,并希望将dll添加到项目中。通过引用 - >添加引用 - >浏览器。然后我选择那个DLL。 然后它给了我一个错误
对''''''的引用.dll可以 不加。请确保 该文件是可访问的,这是一个 有效的汇编或com组件。
有谁知道我在哪里做错了生成/导入dll?
感谢
答案 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是获得一个人的最好方式。