【发布时间】:2015-04-21 06:29:55
【问题描述】:
我有一个非托管 DLL,它只导出一个 C 风格的工厂方法,该方法返回一个类的新实例(此处简化为看起来很简单)。
你好.h
#if defined(HWLIBRARY_EXPORT) // inside DLL
# define HWAPI __declspec(dllexport)
#else // outside DLL
# define HWAPI __declspec(dllimport)
#endif
struct HelloWorld{
public:
virtual void sayHello() = 0;
virtual void release() = 0;
};
extern "C" HWAPI HelloWorld* GetHW();
你好.cpp
#include "hello.h"
struct HelloWorldImpl : HelloWorld
{
void sayHello(){
int triv;
std::cout<<"Hello World!";
std::cin>>triv;
};
void release(){
this->HelloWorldImpl::~HelloWorldImpl();
};
HelloWorld* GetHW(){
HelloWorld* ptr = new HelloWorldImpl();
return ptr;
};
现在,我可以使用 dllimport 来访问 GetHW(),但有没有办法访问返回的“结构”的成员函数...即 sayHello 和 release?
我也遇到了同样的问题。这个问题之前有人问过。我评论了它以寻求更好的解决方案,但尚未得到任何回复。所以,转发吧。
当我用谷歌搜索时,能够找到两个解决方案。
解决方案1:以 C 风格为现有 dll 公开所有成员函数。我不能这样做,因为它是第 3 方 dll。
解决方案 2:编写一个托管 C++ dll,公开本机 C++ dll 的功能,以后可以在您的 C# dll 中使用它。这里存在许多类/功能。因此,创建将花费大部分时间。
我从下面的链接中获得了上述解决方案。 How To Marshall
请告诉我除了上述两种解决方案之外是否还有更好的解决方案?
我有 C++ 解决方案的源代码。但我虽然不是触摸 C++ dll。如果有任何可能在 C# 中做到这一点,那就太好了。
如果没有其他选择,我需要遵循指定的两个解决方案中的任何一个。
【问题讨论】:
-
您正在使用此代码重新发明 COM。但它与 COM 不兼容,因此不能直接从 C# 程序中使用。正确执行此操作需要 C++/CLI 包装器。