我正在尝试在C ++ / CLI .dll项目中使用本机.dll项目中的C ++类。 Visual Studio 2010,.NET Framework 3.5。到目前为止,这就是我所拥有的:
// This is a common macro:
#ifdef ISDLL
#define DLL __declspec(dllexport)
#else
#define DLL __declspec(dllimport)
#endif
NativeProject:
//INativeType.h:
class DLL INativeType {
public:
virtual void Foo() = 0;
};
//NativeType.h:
class DLL NativeType : public INativeType {
public:
virtual void Foo();
};
extern "C" DLL INativeType CreateNativeType();
//NativeType.cpp:
void NativeType::Foo() {}
extern "C" DLL INativeType* CreateNativeType() {
return new NativeType();
}
C++/CLI Project:
// Wrapper.h:
#include "INativeType.h"
ref class Wrapper {
INativeType* m_nativeType;
};
// Wrapper.cpp:
#include "Wrapper.h"
#include "NativeType.h"
// in some method:
m_nativeType = CreateNativeType();
这给了我以下链接器错误:
error LNK2028: unresolved token (...) "extern "C" class INativeType * __stdcall CreateNativeType(void)"" ... in Wrapper.obj
此外,尽管在NativeProject.dll中正确导出了这些函数,但我使用DependencyWalker对其进行了验证,链接器也会发出此警告:
warning LNK4199: /DELAYLOAD:NativeProject.dll ignored; no imports found from NativeProject.dll
C ++ / CLI项目配置为延迟加载NativeProject.dll,并在其链接器选项中包含NativeProject.lib。此时我不知道如何诊断此链接器错误。我做错了什么?
答案 0 :(得分:1)
为什么不让C ++ / CLI项目直接实例化该类而不是工厂方法呢?
除此之外,它看起来就像你正在重新发明COM(通过接口使用对象)。我只是实例化完整的C ++类,或者,如果你真的需要它,使用完整的COM。
编辑:确保工厂方法的调用约定在客户端和DLL中都相同。