无法从.net框架调用atlcom对象

Unable to call an ATL COM object from .NET framework

本文关键字:调用 atlcom 对象 框架 net      更新时间:2023-10-16

我有一个名为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 Testn" ) );
    hr = m_Test.CoCreateInstance(CLSID_Test, NULL, CLSCTX_INPROC_SERVER);
    if (FAILED(hr))
        CREATE_COM_OBJECT_ERROR(_T("Test"));

然而,当我试图从。net应用程序调用这个对象时,它错误地说"类型为'System.Runtime.InteropServices '的未处理异常"。在PatternEditor.exe中出现COMException

附加信息:灾难性失败(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;
        }
    }

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

另一种方法是通过反射。这个答案有一个想法:c# COM和附加事件