今天,我们将应用程序升级到 .NET Framework 4.0。当它调用驻留在网络共享上的程序集时,对于以前的版本,我们需要以下命令:
caspol.exe -m -chggroup 1.3 -zone "Intranet" FullTrust
对于 .NET 4,我们阅读了“NetFx40_LegacySecurityPolicy”并将其包含在 App.config 文件之外。
<runtime>
<NetFx40_LegacySecurityPolicy enabled="true"/>
<loadFromRemoteSources enabled="true"/>
</runtime>
不幸的是,这不起作用:一旦我们的应用程序启动,我们就会收到一个异常,指出我们无法访问环境变量(缺少 System.Security.Permissions.EnvironmentPermission)。
我们使用 CasPol.exe,但无法弄清楚我们必须做什么才能让我们的应用程序访问环境变量。删除 Environment.GetEnvironmentVariable 调用仍然不能解决问题 - 似乎很多其他操作也不起作用。
移除 NetFx40_LegacySecurityPolicy 开关(或将其设置为 false)允许我们再次读取环境,但(当然)会阻止在网络共享上执行程序集。
这是我们完整的 App.config 文件:
<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="Launcher.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
</sectionGroup>
</configSections>
<applicationSettings>
<Launcher.Properties.Settings>
<setting name="Executable" serializeAs="String">
<value>\\office\client\client-8919\Client.exe</value>
</setting>
</Launcher.Properties.Settings>
</applicationSettings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
<runtime>
<NetFx40_LegacySecurityPolicy enabled="true"/>
<loadFromRemoteSources enabled="true"/>
</runtime>
</configuration>
编辑:
这是我们用于启动驻留在网络共享上的程序集的代码:
public void ExecuteFile(string version, string[] args)
{
try
{
String appPath = GetExecutablePath();
if (!Directory.Exists(appPath))
throw new Exception("cache does not contain expected executable directory: " + appPath);
String executable = appPath + "\\Client.exe";
if (!File.Exists(executable))
throw new Exception("cache does not contain expected executable: " + executable);
if (Program.DEBUG_MODE)
MessageBox.Show("App Path: " + appPath + "\r\nExecutable: " + executable);
AppDomainSetup domainInfo = new AppDomainSetup();
domainInfo.ApplicationBase = appPath;
AppDomain subDomain = AppDomain.CreateDomain("Name", AppDomain.CurrentDomain.Evidence, domainInfo);
subDomain.ExecuteAssembly(executable, subDomain.Evidence, args);
}
catch (Exception e)
{
MessageBox.Show("Fehler beim Ausführen der Version im lokalen Cache!\r\n" + e.Message);
}
}