【问题标题】:Import and call COM dll in C# application在 C# 应用程序中导入和调用 COM dll
【发布时间】:2013-02-17 13:36:13
【问题描述】:

请帮助在 C# 应用程序中使用 ATL COM DLL 方法

在 ATLLib.idl 中

...
interface IATLLibMain : IUnknown{
    [helpstring("method hello")] HRESULT hello([out,retval] BSTR* res);
};
...

在 ATLLibMain.cpp(ATLSimpleObject 类)中

STDMETHODIMP CATLLibMain::hello(BSTR* res)
{
    *res = SysAllocString(L"Hello world!!!");
    return S_OK;
}

我已经编译并注册了 COM。 在 C# 项目中,添加了对 ATLLib.dll 的引用并尝试这样的调用方法

IATLLibMain atllib = new ATLLibMainClass();
Console.WriteLine(atllib.hello());

VS 报错

在 ATLLibTest.exe 中发生了 System.Runtime.InteropServices.COMException 类型的未处理异常。

检索具有 CLSID {...} 的组件的 COM 类工厂失败,原因是以下错误 80040154。

上线

IATLLibMain atllib = new ATLLibMainClass();

请显示在 C# 应用程序中使用 ATL DLL 的任何项目示例或帮助修复此错误? 谢谢...

【问题讨论】:

  • 您会得到比这更好的异常信息。 Message 和 ErrorCode 属性对于诊断异常至关重要。只需将消息字符串粘贴到搜索框中,您很有可能找到答案。
  • 除非您还向我们展示了异常的确切错误消息(每个异常都有 Message 属性)以及堆栈跟踪,否则无法判断。也许您在某些更改后忘记重新注册您的 COM dll?
  • Retrieving the COM class factory for component with CLSID {...} failed due to the following error 80040154.在线IATLLibMain atllib = new ATLLibMainClass();
  • 0x80040154 错误 (REGDB_E_CLASSNOTREG) 告诉您的 ATL DLL 在类型库上有问题的类,但实现在某种程度上不正确:没有您引用的接口,而是整个 coclass 托管。您还没有显示问题的代码,这是错误的。

标签: c# dll com atl


【解决方案1】:

您的 C# 代码似乎在 64 位模式下运行,它无法加载 32 位非托管代码。

将 C# 应用程序的 Platform TargetAny CPU 更改为 x86

另外,使用 32 位版本的 regsvr32 注册库(参见 Error Message When You Run Regsvr32.exe on 64-Bit Windows):

%windir%\SysWoW64\regsvr32.exe C:\path\to\library.dll

【讨论】:

  • 但是我的 C# 项目的 Platform Target 已经设置为 x86
  • @ErikKianu,请查看更新(关于图书馆注册)。
  • 谢谢@Sergey,但结果还是一样... Спасибо за помощь Сергей, сделал %windir%\System32\regsvr32.exe /u C:\path\to\library.dll потом %windir%\SysWoW64\regsvr32.exe C:\path\to\library.dll результат без изменений。
猜你喜欢
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 2012-04-19
  • 2014-02-14
  • 2011-05-26
  • 2012-04-28
相关资源
最近更新 更多