【发布时间】:2011-04-12 21:31:50
【问题描述】:
我有一个刚刚从 3.5 升级到 4.0 的 C# 4.0 Winform 应用程序。 C# 4.0 Winforms 应用程序引用了一个 C# 3.5 dll,它将根据用户选择从网络路径加载一系列 dll,然后使用 System.Reflection 创建/调用这些 dll。当应用程序设置为使用 3.5 作为目标框架时,一切正常。升级后出现此错误:
尝试从网络位置加载程序集,这会导致程序集在以前版本的 .NET Framework 中被沙盒化。此版本的 .NET Framework 默认情况下不启用 CAS 策略,因此这种加载可能很危险。如果此加载不打算对程序集进行沙箱处理,请启用 loadFromRemoteSources 开关。请参阅http://go.microsoft.com/fwlink/?LinkId=155569 了解更多信息。
当我尝试从网络路径加载程序集时会发生这种情况:
var assembly = Assembly.LoadFile(path);
在做一些研究时,我发现 CAS 在 4.0 版本中“有点”被淘汰了。我被建议在我的 app.config 中添加以下条目:
<runtime>
<loadFromRemoteSources enabled="true"/>
<NetFx40_LegacySecurityPolicy enabled="true"/>
</runtime>
现在,我得到的例外是:
调用的目标已抛出异常。在 System.RuntimeTypeHandle.CreateInstance(RuntimeType 类型,Boolean publicOnly,Boolean noCheck,Boolean& canBeCached,RuntimeMethodHandleInternal& ctor,Boolean& bNeedSecurityCheck) 在 System.RuntimeType.CreateInstanceSlow(布尔 publicOnly,布尔 skipCheckThis,布尔 fillCache) 在 System.RuntimeType.CreateInstanceDefaultCtor(布尔 publicOnly,布尔skipVisibilityChecks,布尔skipCheckThis,布尔fillCache) 在 System.Activator.CreateInstance(类型类型,布尔非公共) 在 System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr,Binder binder,Object[] args,CultureInfo 文化,Object[] activationAttributes) 在 System.Activator.CreateInstance(类型类型、BindingFlags bindingAttr、Binder binder、Object[] args、CultureInfo 文化、Object[] activationAttributes) 在 System.Reflection.Assembly.CreateInstance(字符串 typeName,布尔忽略大小写,BindingFlags bindingAttr,Binder binder,Object[] args,CultureInfo 文化,Object[] activationAttributes) 在 System.Reflection.Assembly.CreateInstance(字符串类型名称) 在 Architecture.Data.Transformations.AssemblyHelperBase.CreateInstanceExplicit[T](程序集程序集,字符串类型名称) 在 Architecture.Data.Transformations.MappingTransform.ProcessMap(字符串映射,字符串路径,IXPathNavigable 文档) 在 Architecture.Data.Transformations.MappingTransform.Execute(字符串映射,字符串路径,XmlDocument 转换Xml) 在 Architecture.Data.Transformations.MappingTransform.Execute(XmlDocument 转换Xml,Int32 historyID) 在 Architecture.Data.Transformations.TransformationsDataService.TransformXmlMap(XmlDocument 转换Xml,Int32 历史ID) 在 Architecture.Data.Transformations.TransformationsDataService.CreatePCSXml(历史记录历史记录) 在 Architecture.Data.Transformations.TransformationsDataService.ReShred(Int32 historyID)
内部异常是:该程序集不允许部分受信任的调用者。
此异常是在我从网络位置加载程序集后引发的,但我正在尝试使用 Activator 在程序集中创建一个类型的实例。
protected T CreateInstanceExplicit<T>(Assembly assembly, String typeName)
{
return (T)assembly.CreateInstance(typeName);
}
C#4.0 Winforms 应用程序已签名(.snk 文件)。 单击安全设置被检查为完全信任应用程序后。 我尝试过更改 app.config 设置和项目设置的组合,甚至删除签名。我在这里束手无策,试图弄清楚我能做些什么才能让 winforms 应用程序保持 4.0 而不是 3.5。有人可以帮忙吗?
【问题讨论】:
标签: c# .net-4.0 c#-4.0 upgrade code-access-security