我有一个名为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应用程序调用此对象时,它错误地说"未处理的类型' System.Runtime.InteropServices.COMException'发生在PatternEditor.exe
中附加信息:灾难性故障(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;
}
}
答案 0 :(得分:0)
通常,在.NET中使用COM对象的最简单方法是在项目中创建引用(选项卡COM)。它将生成一个“存根”,您可以使用简单的.NET代码。
其他方式是通过反思。这个答案有一个想法:C# COM and attaching events