我有一个用C++编写的DLL,它导出一个函数CreateRisk.该函数返回一个接口指针,如下所示:
extern "C"
{
__declspec(dllexport) IRisk* __stdcall CreateRisk()
{
return new Risk();
}
}
Run Code Online (Sandbox Code Playgroud)
IRisk派生自IUnknown并具有自定义方法Calculate:
class IRisk: public IUnknown
{
public:
virtual int __stdcall Calculate(int i,double s) = 0;
};
Run Code Online (Sandbox Code Playgroud)
Risk类实现了IRisk接口(这里省略了实现).
我想要的是在c#中调用CreateRisk函数并获取对IRisk的引用.
我在c#中定义了一个包装器接口
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IRisk
{
[PreserveSig]
int Calculate(int i,double s);
}
Run Code Online (Sandbox Code Playgroud)
我在C#中添加了一个dll条目
[DllImport("Risk.dll")]
extern static IntPtr CreateRisk();
Run Code Online (Sandbox Code Playgroud)
我可以在C#中调用CreateRisk并获取IntPtr的值类型.有没有办法将IntPtr编组到c#IRisk接口,以便我可以在C#中调用Calculate方法?
我曾尝试过Marshal.GetIUnknownForObjectInContext,Marshal.GetObjectForIUnknown,但无济于事.
我知道创建COM组件可以做到这一点.但是,COM组件需要在系统中注册.我想避免这些麻烦,让C#直接使用C++ dll导出的接口.
PS:
以下是我的Risk类实现:
class IRisk : public IUnknown
{
public:
virtual int __stdcall Calculate(int i,double y ) = 0;
};
class Risk:public IRisk
{
int count;
public: …Run Code Online (Sandbox Code Playgroud)