3

我有一个刚刚从 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。任何人都可以帮忙吗?

4

1 回答 1

2

你的<loadFromRemoteSources>元素没有效果。它在 MSDN 文档中明确指出:

此元素的 enabled 属性仅在禁用代码访问安全性 (CAS) 时有效。

您启用了 CAS。运行 Caspol.exe 以将信任分配给网络位置。说明在这里

于 2010-09-15T20:49:40.857 回答