.NET Interop - 将COM接口从托管代码传递到本机

时间:2017-08-27 19:25:44

标签: .net c++-cli interop marshalling com-interop

假设我在某些类型库 Foo.tlb 中定义了COM接口IFoo

我还有用C ++编写的非托管DLL,它导出以下函数(期望作为实现IFoo的输入COM对象):

#import "Foo.tlb"

__declspec(dllexport) void MyFunc(Foo::IFoo* p)
{
    ...
}

现在,我已经在代码中的某处使用IFoo^编写了用C ++ / CLI编写的托管程序集。我将项目引用添加到上面的DLL并想要调用MyFunc()

以下代码的正确语法是什么?如何指定CLR以执行从IFoo^IFoo*的编组操作? (我希望它自动创建COM Callable Wrapper)

__declspec(dllexport) void MyFunc(Foo::IFoo* p);

void CallDLL(Foo::IFoo^ f)
{
    MyFunc(f);
}


解决方法:

如果我更改代码以将参数传递为void *并手动创建CCW - 它可以工作:

Unmanaged(C ++):

#import "Foo.tlb"

__declspec(dllexport) void MyFunc(void* p)
{
    Foo::IFoo *pFoo = (Foo::IFoo *)p;
    ...
}

托管(C ++ / CLI):

__declspec(dllexport) void MyFunc(void *p);

void CallDLL(Foo::IFoo^ f)
{
    IntPtr p;
    try
    {
        p = Marshal::GetComInterfaceForObject(f, Foo::IFoo::typeid);
        MyFunc((void *)p);
    }
    finally
    {
        Marshal::Release(p);
    }
}

但我怎么能强力打字呢?

0 个答案:

没有答案