C# 3.5 winforms app升级到C#4.0 排除CAS问题

标签 c# .net-4.0 c#-4.0 upgrade code-access-security

我有一个 C# 4.0 Winform 应用程序,我刚刚从 3.5 升级到 4.0。 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( bool publicOnly, bool skipCheckThis, bool fillCache) 在 System.RuntimeType.CreateInstanceDefaultCtor( bool publicOnly, bool skipVisibilityChecks, bool skipCheckThis, bool fillCache) 在 System.Activator.CreateInstance(Type 类型,Boolean nonPublic) 在 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(String typeName,Boolean ignoreCase,BindingFlags bindingAttr,Binder Binder ,Object[] args,CultureInfo 文化,Object[] activationAttributes) 在 System.Reflection.Assembly.CreateInstance(字符串类型名称) 在 Architecture.Data.Transformations.AssemblyHelperBase.CreateInstanceExplicit[T](Assembly assembly, String typeName) 在 Architecture.Data.Transformations.MappingTransform.ProcessMap(字符串映射、字符串路径、IXPathNavigable 文档) 在 Architecture.Data.Transformations.MappingTransform.Execute(字符串映射、字符串路径、XmlDocument transformedXml) 在 Architecture.Data.Transformations.MappingTransform.Execute(XmlDocument transformedXml,Int32 historyID) 在 Architecture.Data.Transformations.TransformationsDataService.TransformXmlMap(XmlDocument transformedXml,Int32 historyID) 在 Architecture.Data.Transformations.TransformationsDataService.CreatePCSXml(HistoryRecord historyRecord) 在 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。谁能帮忙?

最佳答案

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

The enabled attribute for this element is effective only when code access security (CAS) is disabled.

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

关于C# 3.5 winforms app升级到C#4.0 排除CAS问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3721471/

相关文章:

c# - XElement 查询给出错误 : "Sequence contains no elements"

c# - 查找具有特定备用数据流的所有文件是否是存储自定义标签的有效方法?

c# - 为什么资源文件中的标签大小会发生变化?

C# 'dynamic' 关键字...它真的是一个 RESERVED 关键字还是只是一个标识符,当用作类型时意味着一些特殊的东西?

c# - 带参数的 RoutedCommand

c# - 更改 Designer.cs 文件是否安全?

c#/.Net Socket.Shutdown 关闭

c# - 将字符串转换为对象类型

c# - 在 selenium c# 的下拉列表中截取选项的屏幕截图

c# - Validation.ErrorTemplate 确实在绑定(bind)到对象属性时触发