2012-06-01 56 views
2

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

在Microsoft Visual C#2010 Express中,我转到Project->Publish <project name>,它生成一些文件,其中包括setup.exe安装程序。

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

但是当我运行该程序,它只是关闭了一句话:

ProjectName.exe has encountered a problem and needs to close. We are sorry for the inconvenience.

命令窗口中也出现了短短的一秒钟一些错误,但它很难辨认出它是什么说什么。它看起来像这样:

Unhandled Exception: System.Runtime.InteropServices.COMException: Retrieving the COM class factory for the component with CLSID { ....... } failed due to the following error: .....

我无法让命令窗口留下来,所以我不能得到完整的消息。但我认为这是由于其他计算机没有这些第三方DLLS。

我怎样才能有Visual C#2010包一切包括DLL,所以这个错误不会出现?或者如果这可能不是真正的问题,我该如何阻止命令窗口立即消失? (我不知道所需DLL的完整列表)

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

+0

这可能有助于:http://dependencywalker.com/(显然你可能想要注意这个问题:http://stackoverflow.com/q/2557954/344286) –

+0

在VS2010中使用'Setup&Deploy Project'亲与所有文件打包。 – uday

回答

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块应该足够了。如果这没有帮助,请尝试为应用程序未处理异常时引发的事件添加事件处理程序(根据您创建的应用程序的类型,这可能会有所不同)。

+0

try/catch帮助阻止cmd窗口消失,我能够看到错误。 – JBurace