COM 互操作未通过接口检测 .NET 函数

本文关键字:检测 NET 函数 接口 互操作 COM | 更新日期: 2023-09-27 18:36:55

我有一个 .NET 程序集,我已经执行了regasmgacutil。我还有一个 COM 互操作,我正在尝试使用它 .NET 程序集。但是,通过我的pDotNetCOMPtr我无法"检测".NET 公共接口上的任何方法。MFC COM DLL 一直说,当我尝试使用 Visual Studio 2010 进行编译时,_SslTcpClientPtr中没有称为Encrypt的方法。我正在使用.NET 4.0框架。思潮?

COM/MFC

extern "C" __declspec(dllexport) BSTR __stdcall Encrypt(BSTR encryptString)
{   
    CoInitialize(NULL);
    ICVTnsClient::_SslTcpClientPtr pDotNetCOMPtr;
    HRESULT hRes = pDotNetCOMPtr.CreateInstance(ICVTnsClient::CLSID_SslTcpClient);
    if (hRes == S_OK)
    {
        BSTR str;
        hRes = pDotNetCOMPtr->Encrypt(encryptString, &str);     
        if (str == NULL) {
            return SysAllocString(L"EEncryptionError");
        }
        else return str;    
    }
    pDotNetCOMPtr = NULL;
    return SysAllocString(L"EDLLError");
    CoUninitialize ();
}

。网

namespace ICVTnsClient
{
    [Guid("D6F80E95-8A27-4ae6-B6DE-0542A0FC7039")]
    [ComVisible(true)]
    public interface _SslTcpClient
    {
        string Encrypt(string requestContent);
        string Decrypt(string requestContent);        
    }
    [Guid("13FE33AD-4BF8-495f-AB4D-6C61BD463EA4")]
    [ClassInterface(ClassInterfaceType.None)]
    public class SslTcpClient : _SslTcpClient
    {
       ...
       public string Encrypt(string requestContent) { // do something }
       public string Decrypt(string requestContent) { // do something }
    }
  }
}

COM 互操作未通过接口检测 .NET 函数

这是因为您忘记了 [InterfaceType] 属性,以便接口可以提前绑定,并且方法名称显示在类型库中。 修复:

[Guid("D6F80E95-8A27-4ae6-B6DE-0542A0FC7039")]
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface _SslTcpClient
{
    // etc..
}

ComInterfaceType.InterfaceIsDual 允许它同时绑定早期和晚期绑定。 Microsoft更喜欢默认的IsIDispatch,而不是后期绑定的射脚方式。