【发布时间】:2015-06-02 08:42:18
【问题描述】:
我已经用 C# 实现了一个 COM 组件:
[ComVisible(true)]
[System.Runtime.InteropServices.Guid("E052BB1C-7ADC-47F4-99E1-9407E2FA0AA2")]
public interface IColorRamps
{
IColorRamp getColorRamp();
}
[ComVisible(true)]
[Guid("EE47F2F2-0AD9-437C-8815-D570EACF2C07")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("ColorRamps.ColorRamps")]
public class ColorRamps : IColorRamps
{
public IColorRamp getColorRamp() { ... }
}
我从 C++ 中调用它:
IColorRampPtr colorRamp;
{
ColorRamps::IColorRampsPtr colorRamps(ColorRamps::CLSID_ColorRamps);
HRESULT hr = colorRamps->getColorRamp(&colorRamp);
colorRamp.AddRef(); // Should I do this??
}
起初我没有调用 AddRef() 并且一切似乎都正常,只是在多次运行此代码后出现“R6025(纯虚函数调用)运行时错误”的奇怪崩溃。
自动生成的 .tlh 文件中的签名是:
virtual HRESULT __stdcall getColorRamp(/*[out,retval]*/ struct IColorRamp * * pRetVal ) = 0;
当在 C++ 中调用这样的函数时,我习惯于函数本身执行 AddRef() 并将内存所有权传递给调用者。在 C# COM 中不是这样吗?
我没有在 ColorRamps.getColorRamp() 中调用 Marshal.AddRef()。
【问题讨论】: