无法从 .NET 框架调用 ATL COM 对象

Posted

技术标签:

【中文标题】无法从 .NET 框架调用 ATL COM 对象【英文标题】:Unable to call an ATL COM object from .NET framework 【发布时间】:2014-09-20 00:47:37 【问题描述】:

我有一个名为 Test 的 COM 对象,.rgs 文件如下所示。我确实看到这个类在 HKEY_LOCAL_MACHINE>>SOFTWARE>>Classes>>CLSID 位置的注册表中注册。

HKCR
   
    NoRemove CLSID
    

        ForceRemove 17899D17-698D-4781-894C-3BAA80F3D4BB = s 'Test Class'
        
            ForceRemove 'Programmable'
            InprocServer32 = s '%MODULE%'
            
                val ThreadingModel = s 'Apartment'
            
            val AppID = s 'D2A47892-4C98-11D6-8C6D-00105A1790CD'
            'TypeLib' = s '9A887890-4C99-11d6-8C6D-00105A1790CD'
        
    

当我在 C++ 项目中创建此对象的实例时,它工作正常。使用的代码是:

ATLTRACE( _T( " | CoCreateInstance Test\n" ) );
    hr = m_Test.CoCreateInstance(CLSID_Test, NULL, CLSCTX_INPROC_SERVER);
    if (FAILED(hr))
        CREATE_COM_OBJECT_ERROR(_T("Test"));

但是,当我尝试从 .NET 应用程序调用此对象时,它会出错,提示“PatternEditor.exe 中发生‘System.Runtime.InteropServices.COMException’类型的未处理异常

附加信息:Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))”。使用的代码如下:

        public partial class MainWindow : Window
    
        Main m_Main = new Main();
        Test m_Test;

        public MainWindow()
        
            InitializeComponent();
            //This line errors
            m_Test = m_Main.Test;
        
    

【问题讨论】:

【参考方案1】:

通常,在 .NET 中使用 COM 对象的最简单方法是在项目中创建一个引用(COM 选项卡)。它将生成一个“存根”,您可以将其用作简单的 .NET 代码。

另一种方法是通过反射。这个答案有想法:C# COM and attaching events

【讨论】:

以上是关于无法从 .NET 框架调用 ATL COM 对象的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ATL 创建 VB6 集合对象

ATL 结构在来自 dll 的 COM 对象上中断

从 MFC 调用 ATL COM dll

在 .NET 中创建 C++ ATL COM 嵌套命名空间,如 System 命名空间

ATL/COM 对象的链接方法

如何将聚合 .NET COM 互操作添加到 ATL EXE 服务器?