【问题标题】:Change x86 platform to Any CPU for .NET 3.5 throws COMException将 x86 平台更改为 .NET 3.5 的任何 CPU 会引发 COMException
【发布时间】:2015-06-08 20:21:53
【问题描述】:

我正在尝试将 C# 应用程序的平台目标从 x86 更改为 Any CPU。我的应用程序使用 _click 方法运行一个新线程,该线程使用以下方法打开查看器窗口来显示窗口:

public void Show(string url, int entityId, string sessionId, int projId, string docId)
{
    base.Show();
    try
    {
        this.DocViewer.InitComm(url, entityId, sessionId, projId, docId);
    }
    catch (Exception ex)
    {
        Logger.Error("Error opening viewer", ex);
        throw;
    }
}    

在 x86 平台上运行时,应用程序运行没有问题。我将平台更改为“任何 CPU”并收到“COMException 未处理”错误:“未注册类(HRESULT 中的异常:0X80040154(REGDB_E_CLASSNOTREG))”突出显示:

base.Show();

我已经研究过这个错误的原因,它似乎是由于registry redirection。因为我使用的是 .NET 3.5,所以我无法使用我找到的许多解决方案,包括来自 SO 上的this thread 的解决方案。我不清楚here 的信息有什么帮助,因为许多代码链接都是用 C++ 编写的。

如果有人能给我提供见解,我将不胜感激。

【问题讨论】:

  • COM 组件可能没有在 x64 注册表中注册自己,因为它在 x64 中不起作用。您需要确保 COM 组件的开发人员确实支持 x64,并且您实际安装了它的 64 位版本。
  • DocViewer 是什么?如果这是一个原生 32 位组件,您将无法将其加载到 64 位进程中,这是为 64 位平台上的 AnyCPU 可执行文件创建的。
  • 没错,它看起来很简单——不能简单地在 64 位 exe 中使用 32 位进程内 DLL。也可以看看这个,例如解决方法:stackoverflow.com/questions/8660357/…

标签: c# comexception target-platform


【解决方案1】:

这是一个完全正常的事故。显然,您依赖于 COM 服务器,并且他们非常关心您的程序是在 32 位还是 64 位模式下运行。 COM 服务器是用本机代码编写的,通常是 C++,在 64 位模式下需要不同风格的本机代码。

如果它是 Windows 的一部分并且不是太旧,您只能指望拥有 64 位版本的这种 COM 服务器。但其中绝大多数是第 3 方产品,仅提供 32 位版本。如果它是您自己的,那么您必须构建它的 x64 版本,如果它是第 3 方,那么您将不得不使用电话。我们无法帮助您找到号码。如果您需要提示,请查看项目的程序集引用并查看文件的属性,您很可能会在版权声明中看到供应商名称。

【讨论】:

  • 非常感谢!由于这是第 3 方产品,并且仅提供 32 位版本,因此决定需要将 x86 用作平台目标。尽管此解决方案并不理想,但我得到了答案以及原因。 +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多