无法从 .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 对象的主要内容,如果未能解决你的问题,请参考以下文章