2

我有一个相当基本的 Visual C# 项目(不超过 100 行),但它包含一些第 3 方 DLL 引用。在开发它的计算机上运行项目,它运行得很好。

在 Microsoft Visual C# 2010 Express 中,我访问Project->Publish <project name>并构建了一些文件,包括 setup.exe 安装程序。

当我将这些文件移动到另一台计算机并运行 setup.exe 时,它​​会正确安装程序。

但是当我运行程序时,它只是简单地关闭说:

ProjectName.exe 遇到问题,需要关闭。对此造成的不便,我们表示歉意。

命令窗口也会出现短暂的一秒钟,并出现一些错误,但很难弄清楚它在说什么。它看起来像:

未处理的异常:System.Runtime.InteropServices.COMException:检索具有 CLSID { ....... } 的组件的 COM 类工厂失败,原因是以下错误:.....

我无法让命令窗口保持不变,因此我无法获得完整的消息。但我认为这是由于另一台计算机没有那些 3rd 方 DLLS。

如何让 Visual C# 2010 打包包括 DLL 在内的所有内容,以便不会出现此错误?或者,如果这可能不是实际问题,我怎样才能阻止命令窗口立即消失?(我不知道所需的 DLL 的完整列表)

或者如果 DLL 是 C:\Windows\system32 下的注册 DLL,项目是否永远不会将其构建到包中?有没有办法查看它取决于什么?

4

1 回答 1

3

Visual Studio 2010 Express 不会创建功能齐全的安装程序,而只会创建 ClickOnce 安装程序,以及功能有限的安装程序。这种安装程序无法注册 COM DLL。

在您的情况下似乎有问题的是您使用的是未在目标系统上注册的 COM DLL。您可以尝试在您自己的程序中进行检查(例如尝试创建类并捕获由 CreateObject 函数引发的任何异常),然后调用 RegSvr32.exe /s 以注册它。或者您只是在程序第一次启动时执行此操作,在您从 DLL 创建任何对象之前……虽然没有尝试过。

您还可以确保在运行程序之前在目标系统上手动注册 DLL。

此外,当 .Net 使用 COM DLL 时,它通常会创建一个兼容性程序集来包装 COM DLL 并使 .Net 可以访问它。如果您使用的 DLL 只是这个兼容性程序集,您可能必须在您的系统上手动找到它所依赖的 COM DLL,并将其显式包含在您的项目文件中。

为了调试,在 CreateObject 周围放置 try/catch 块就足够了。如果这没有帮助,请尝试为应用程序未处理异常时引发的事件添加事件处理程序(根据您创建的应用程序类型,这可能会有所不同)。

于 2012-06-01T18:17:32.543 回答