我编写了一个.NET 4桌面应用程序,在尝试运行Setup.exe时,我在日志文件中收到以下错误。
我正在使用Visual Studio 2012和Wix 3.7。
MSI (s) (E8:1C) [16:51:54:890]: Invoking remote custom action. DLL: C:\windows\Installer\MSIFECD.tmp, Entrypoint: EncryptConfig
SFXCA: Extracting custom action to temporary directory: C:\windows\Installer\MSIFECD.tmp-\
SFXCA: Binding to CLR version v4.0.30319
Calling custom action SecureConfig!SecureConfig.CustomActions.EncryptConfig
EncryptConfig: Begin
An error occurred creating the configuration section handler for security: Could not load file or assembly 'Order.Configuration.Net' or one of its dependencies. The system cannot find the file specified. (C:\Program Files (x86)\Orbit Order System\Orbit Order System.exe.config line 6)
CustomAction EncryptConfigurationFile returned actual error code 1603 (note this may not be 100% accurate if translation happened inside sandbox)
Action ended 16:51:55: InstallFinalize. Return value 3.
我可以确认目标文件夹中存在`Order.Configuration.Net.dll',应用程序配置文件也是如此。
这是app.config文件:
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="backup"
type="OrderConfiguration.BackupConfig, Order.Configuration.Net"/>
<section name="general"
type="OrderConfiguration.GeneralConfig, Order.Configuration.Net"/>
<section name="security"
type="OrderConfiguration.SecurityConfig, Order.Configuration.Net"/>
<-- ** THIS IS LINE 6 **
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
</startup>
<backup configSource="config\backup.config"/>
<general configSource="config\general.config"/>
<security configSource="config\security.config"/>
<connectionStrings>
<clear/>
<add name="OrderDb"
connectionString="Data Source=(local);Initial Catalog=OrbitOrder;
User Id=User;Password=Pass;MultipleActiveResultSets=true;"/>
</connectionStrings>
</configuration>
我还确认目标文件夹中存在config\security.config
。
我花了三个小时试图找出错误意味着什么,因为所有文件实际存在于目标文件夹中。我实际上复制了我在一年前工作的先前解决方案中设置的WIX,并且一个工作正常,没有任何问题。
失败的自定义操作是尝试加密security
配置部分。
我无法解释为什么MSI在没有任何错误时会抛出1603
错误。
答案 0 :(得分:1)
我在将以下代码添加到Wix自定义操作后设法解决了这个问题:
AppDomain.CurrentDomain.AssemblyResolve += ( sender, args ) =>
{
return Assembly.LoadFrom( string.Format( @"{0}Order.Configuration.Net.dll", installFolder ) );
};
这基本上表示在遇到需要解析的引用时加载程序集。
答案 1 :(得分:0)
根据日志,您编写的自定义操作会返回错误,因此请在安装期间调试自定义操作dll。调试自定义操作的最简单方法是在代码中添加一个消息框(自定义操作开始),并在显示消息框时附加到visual studio中的进程。另一种方法是使用http://msdn.microsoft.com/en-us/library/aa368264%28v=vs.85%29.aspx
中描述的MsiBreak环境变量