我有一个相当基本的Visual C#项目(不超过100行),但它包含一些第三方DLL引用。在它开发的计算机上运行项目运行得很好。
在Microsoft Visual C#2010 Express中,我转到Project->Publish <project name>
,它会构建一些文件,包括setup.exe安装程序。
当我将这些文件移动到另一台计算机并运行setup.exe时,它会正确安装该程序。
但是当我运行该程序时,它只是简单地说:
ProjectName.exe遇到问题,需要关闭。对于给您带来的不便,我们深表歉意。
命令窗口也会短暂出现,但有一些错误,但很难弄清楚它的含义。它看起来像:
未处理的异常:System.Runtime.InteropServices.COMException:由于以下错误,检索具有CLSID {.......}的组件的COM类工厂失败:.....
我无法让命令窗口停留,所以我无法获得完整的消息。但我认为这是由于其他计算机没有第三方DLLS。
如何将Visual C#2010包所有包含在DLL中,以便不出现此错误?或者,如果这可能不是实际问题,我怎么能阻止命令窗口立即消失? (我不知道所需的完整DLL列表)
或者如果DLL是C:\ Windows \ system32下的注册DLL,项目是否永远不会将其构建到包中?有没有办法看到它取决于什么?
答案 0 :(得分: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,并将其明确地包含在项目的文件中。
为了进行调试,将try / catch块放在CreateObject周围就足够了。如果这没有帮助,请尝试为应用程序未处理异常时引发的事件添加事件处理程序(根据您创建的应用程序类型,这可能会有所不同)。