我有一個非託管DLL只導出一個返回類的新實例的C樣式工廠方法(這裏簡化看起來很簡單)。當成員函數未被導出時,從C#調用C++ native/unmanaged成員函數
hello.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();
HELLO.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(),但有訪問返回的「結構的成員函數的方式'...即,說你好,並釋放?
我也被困在同樣的問題。這個問題曾被問過一陣子。我評論了它的任何更好的解決方案,但沒有得到任何答覆。所以,重新發布它。
當我GOOGLE時,能夠找出兩個解決方案。
解決方案1:爲現有的dll公開C樣式的所有成員函數。我不能這樣做,因爲它是第三方DLL。解決方案2:編寫一個託管的C++ dll,暴露本機C++ dll的功能,以後可以在您的C#dll中使用它。這裏有很多類/功能。所以,創建將需要大部分時間。
我從下面的鏈接中獲得了上述解決方案。 How To Marshall
請讓我知道是否有任何更好的解決方案比以上兩種解決方案?
我有C++解決方案的源代碼。但是,我雖然不是碰C++的DLL。如果有可能在C#中做到這一點,那就太好了。
如果沒有其他選擇,我需要遵循指定的兩個解決方案中的任何一個。
查看[在.NET應用程序中使用非託管C++庫(DLL)](http://www.codeproject.com/Articles/14180/Using-Unmanaged-C-Libraries-DLLs-in-NET-應用程序) – WaeCo
您正在使用此代碼重新創建COM。但它不是COM兼容的,所以不能直接從C#程序中使用。 C++/CLI包裝器需要正確執行。 –