我有一个刚刚从 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(Boolean publicOnly,Boolean skipCheckThis,Boolean fillCache)在 System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly , Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) at System.Activator.CreateInstance(Type type, Boolean nonPublic) at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfoculture, Object[] activationAttributes) at System.Activator.CreateInstance(类型类型,BindingFlags bindingAttr,Binder binder,Object[] args,CultureInfo 文化,
内部例外是:该程序集不允许部分受信任的调用者。
这个异常是在我从网络位置加载程序集之后抛出的,但我试图使用激活器在程序集中创建一个类型的实例。
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。任何人都可以帮忙吗?