【问题标题】:C# 3.5 winforms app upgraded to C#4.0 issue because of the exclusion of CAS由于排除 CAS,C# 3.5 winforms 应用程序升级到 C#4.0 问题
【发布时间】: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


    【解决方案1】:

    您的&lt;loadFromRemoteSources&gt; 元素无效。它在 MSDN 文档中明确指出:

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

    您启用了 CAS。运行 Caspol.exe 以将信任分配给网络位置。指令are here.

    【讨论】:

    • 它就像一个魅力!太感谢了!我在这上面浪费了 2 天时间,而且截止日期很紧。我试图“投票”你的答案,但我是一个新用户,在我有 15 个声望点之前不能这样做。做完我会回来的。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    相关资源
    最近更新 更多