如何修复“找不到自定义操作文件的安装项目”异常?

时间:2010-12-23 05:55:01

标签: windows-services setup-project custom-action ssis

我正在尝试为Windows服务创建安装项目。我按照http://support.microsoft.com/kb/816169的说明创建了安装项目,没有任何问题。

我希望能够在安装过程中获取一个值,以便使用用户所需的设置更新app.config。我添加了一个 Textboxes(A)对话框来检索值。我将 Edit1Property 属性设置为“TIMETORUN”,并在我的主要输出操作的 CustomActionData 属性中输入以下内容: / TimeToRun =“[TIMETORUN] \” 。到现在为止还挺好。运行设置我可以毫无问题地从 Context.Parameters 集合中检索 TimeToRun 值。

为了找到app.config,我还需要将 TARGETDIR Windows Installer属性的值传递给我的自定义操作。事情开始分崩离析。为了实现这一点,必须改变上述 CustomActionData / TimeToRun =“[TIMETORUN] \”/ TargetDir =“[TARGETDIR] \”。现在,当我运行安装程序时,我收到以下错误消息:

错误1001.初始化安装时发生异常。 System.IO.FileNotFoundException:无法加载文件或程序集'file:/// C:\ Windows \ SysWOW64 \ Files'或其依赖项之一。系统不能 找到指定的文件。

如果你谷歌这个问题,只需在 CustomActionData / TargetDir =“[TARGETDIR] \”部分添加尾部斜杠,就不可避免地会找到人们取得巨大成功的人>。遗憾的是,这并没有解决我的问题。

我尝试了 CustomActionData 字符串的许多不同变体,但没有一个工作。我尝试从我重写的 Install 方法中记录到一个文件以确定破坏的位置,但是没有创建日志文件,因为它甚至没有达到那么远。如错误所示,失败是在初始化步骤期间。

我有一种预感,它可能是安装项目尝试加载的依赖项之一。也许某种东西被附加到 CustomActionData 字符串并且不能很好地与 TARGETDIR 值(包含空格,即“C:\ Program Files \ My Company \”项目名”)。同样,这是另一种预感,由于我无法调试设置过程,我似乎无法确认。

还有一件事需要提及,是的,这是另一种预感,这可能是64位版Windows上安装项目的问题吗?我正在运行Windows 7 Professional。

如果有帮助,我会提供依赖项的名称:

  • Microsoft .NET Framework
  • Microsoft.SqlServer.DtsMsg.dll
  • Microsoft.SqlServer.DTSPipelineWrap.dll
  • Microsoft.SqlServer.DTSRuntimeWrap.dll
  • Microsoft.SQLServer.ManagedDTS.dll
  • Microsoft.SqlServer.msxml6_interop.dll
  • Microsoft.SqlServer.PipelineHost.dll
  • Microsoft.SqlServer.SqlTDiagM.dll

正如您可能从依赖项中收集的那样,Windows服务正在安排对DTSX程序包的调用。

对不起长吼。感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:38)

答案非常简单。如果CustomActionData中的最后一个参数将包含空格,因此您必须用引号和尾部斜杠包围它,则还必须在尾部斜杠后面加一个空格,如下所示:

/ TimeToRun =“[TIMETORUN] \”/ TargetDir =“[TARGETDIR] \”

可以找到解决方案和解释here

答案 1 :(得分:1)

有类似的问题。在我的情况下,这是奇怪的,因为我的安装程序已成功运行一次,然后我通过添加/删除程序成功卸载我的应用程序,做了一些编码(没有触摸我的 CustomActionData 字符串),并重建我的项目和安装项目。当我重新运行我的MSI时,我收到了这个错误。

我所做的编码是为了引入我在 CustomActionData 字符串中指定的更多参数值。获取参数值(即string filepath = Context.Paramenters["filepath"])的语法实际上很好,但是正如我发现的那样,我现在试图从我的获取的后面参数的语法CustomActionData 字符串从一开始就不正确。我没有在其中一个参数周围添加第二个引用,因此无法获得其他任何参数。

我在用户界面部分使用“文本框(A)”和“文本框(B)”窗口。 A有1个框EDITA1,其中我获取文件的路径,B有2个框,EDITB1EDITB2,用于某些数据库参数。我的 CustomActionData 字符串如下所示:

/filepath="[EDITA1]" /host="[EDITB1] /port="[EDITB2]" 

应该是:

/filepath="[EDITA1]" /host="[EDITB1]" /port="[EDITB2]" 

(关于[EDITB1]的报价)