C# 从安装程序c中找到磁盘上安装程序exe的原始位置#

C# 从安装程序c中找到磁盘上安装程序exe的原始位置#,c#,windows-installer,working-directory,C#,Windows Installer,Working Directory,我有一个MSI安装程序,它在最后运行一个c#自定义操作,在安装程序退出之前执行一个sql脚本。我们决定最好的方法是将sql脚本文件粘贴到与MSI文件相同的目录中,并让它以这种方式加载脚本 问题是,安装程序将自身复制到Windows\system32,然后从那里执行,因此我无法找到原始目录以执行脚本文件。任何帮助或想法都将不胜感激 房产对你有帮助吗 Windows安装程序将OriginalDatabase属性设置为用于启动安装的安装数据库的路径。如果从命令行启动安装,则该值取决于重新安装模式属性中

我有一个MSI安装程序,它在最后运行一个c#自定义操作,在安装程序退出之前执行一个sql脚本。我们决定最好的方法是将sql脚本文件粘贴到与MSI文件相同的目录中,并让它以这种方式加载脚本

问题是,安装程序将自身复制到Windows\system32,然后从那里执行,因此我无法找到原始目录以执行脚本文件。任何帮助或想法都将不胜感激

房产对你有帮助吗

Windows安装程序将OriginalDatabase属性设置为用于启动安装的安装数据库的路径。如果从命令行启动安装,则该值取决于重新安装模式属性中是否存在recache软件包选项(-v标志)


如果您在C语言中编写托管的自定义操作,则应该使用Windows安装程序XML(WIX)部署工具基金会(DTF)。您可以创建一个C#项目,并将您的SQL文件添加为项目内容,然后将其打包,并在运行时在当前目录中可用


顺便说一句,假设(或不是)您正在使用MSSQL,WiX已经有SQL脚本执行处理。

为什么要将安装程序复制到系统文件夹中?我没有。它自己在做。或者至少它看起来就是这么做的。当我写出Directory.CurrentDirectory时,它会显示Windows/system32,即使我是从硬盘上的某个随机位置启动它。有人能解释一下吗?@itslitlejohnwindows安装程序总是缓存安装包。例如,当原始软件包不再可用时,卸载时需要该软件包。安装程序将从另一个安装文件启动。从命令行算起吗?不过看起来它应该对我有用。我将在周一试用。@itslitlejohn我想他们谈论的是不同的语法:
msiexec/I product.msi
是第一种情况
msiexec/x{PRODUCT-GUID}
是第二种情况。第一种情况对应于在Windows资源管理器中双击.msi文件时执行的操作。您知道第二种情况指的是什么吗?这可能不重要,但我不知道如何判断正在使用哪个案例。安装程序和msi都是由安装程序项目生成的。@itslitlejohn第一种情况是安装。当产品已经安装时,调用它
msiexec/i product.msi
通常会显示修改、修复和删除选项。然后,“添加/删除程序”使用产品GUID卸载或修改/修复。在这种情况下,Windows Installer将GUID转换为缓存的.msi包的路径;缓存包附近不会有其他支持文件-这是OriginalDatabase属性描述中的第三种情况。第二种情况是,当您运行修复并希望使用-v标志重新检查原始软件包时。请参阅
/f
标志及其
v
选项。如果在运行修复时出现
v
,则您(肯定)将从源代码运行修复操作,并且
OriginalDatabase
属性将指向源程序包。否则它将指向缓存的副本。我们决定使用此副本的安装项目,因为它没有那么复杂。但在未来,WiX似乎是一个很好的解决方案。在运行时添加脚本的问题(在任何一种情况下都很简单)是脚本根据客户端的不同而不同。所以我们希望能够在手动安装时把它手动删除。DTF CA基本上是C++的DLL,所以你仍然可以用安装项目使用它们。您可能还想考虑将它从安装程序中移到应用程序中,作为第一次运行的一部分。我已经用几个脚本完成了这一点,但是我们决定不使用这个脚本的原因是因为它对于每个安装都是不同的,而且并不总是必要的。因此,这增加了灵活性。谢谢你的建议!