System.MethodAccessException:尝试通过安全透明方法访问安全关键方法在所有应用程序上失败
Posted
技术标签:
【中文标题】System.MethodAccessException:尝试通过安全透明方法访问安全关键方法在所有应用程序上失败【英文标题】:System.MethodAccessException: Attempt by security transparent method to access security critical method fails on all applications 【发布时间】:2012-08-19 00:23:46 【问题描述】:您好,提前感谢您的帮助, 我知道已经发布了这个问题或类似的问题,通常与 MVC 3 应用程序有关。但是,每当我尝试使用 .net 4.0 目标框架从 Visual Web Developer Express 2010 中启动任何应用程序时,都会收到此错误消息。
确切的错误信息是:
尝试通过安全透明方法“System.Runtime.Diagnostics.DiagnosticTrace..ctor(System.String, System.Guid)”访问安全关键方法“System.Runtime.Diagnostics.EtwDiagnosticTrace..ctor(System.String, System.Guid)'失败`。
Assembly 'System.ServiceModel.Internals, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 标有 AllowPartiallyTrustedCallersAttribute,并使用 2 级安全透明模型。 2 级透明度会导致 AllowPartiallyTrustedCallers 程序集中的所有方法默认变为安全透明,这可能是导致此异常的原因。
堆栈跟踪:
[MethodAccessException: Attempt by security transparent method 'System.Runtime.Diagnostics.DiagnosticTrace..ctor(System.String, System.Guid)' to access security critical method 'System.Runtime.Diagnostics.EtwDiagnosticTrace..ctor(System.String, System.Guid)' failed.
Assembly 'System.ServiceModel.Internals, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' is marked with the AllowPartiallyTrustedCallersAttribute, and uses the level 2 security transparency model. Level 2 transparency causes all methods in AllowPartiallyTrustedCallers assemblies to become security transparent by default, which may be the cause of this exception.]
System.Runtime.Diagnostics.DiagnosticTrace..ctor(String traceSourceName, Guid etwProviderId) +24
System.ServiceModel.Activation.FxTrace.InitializeTracing() +90
System.ServiceModel.Activation.FxTrace.get_Trace() +84
System.ServiceModel.ServiceHostingEnvironment.EnsureInitialized() +59
System.ServiceModel.ServiceHostingEnvironment.OnEnsureInitialized(Object state) +4
System.ServiceModel.AspNetPartialTrustHelpers.PartialTrustInvoke(ContextCallback callback, Object state) +52
System.ServiceModel.ServiceHostingEnvironment.SafeEnsureInitialized() +65
System.ServiceModel.Activation.HttpModule.ProcessRequest(Object sender, EventArgs e) +58
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +143
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +69
我在这里完全不知所措。如果我从头开始创建任何基本应用程序并尝试启动它,即使没有添加任何内容,我也会收到此错误屏幕。我试过删除 来自
的 target framework="4.0" 属性<compilation debug="true" targetFramework="4.0" />
标记并运行它没有结果。我已经尝试删除该属性并添加
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v2.0.50727"/>
<supportedRuntime version="v4.0.30319"/>
</startup>
如该线程中所建议:BadImageFormatException - Is it possible to specify which .NET version is used to run an executable? 我尝试修复 .Net 4.0 框架安装,因为我听说这可能是一个问题。 我昨晚刚刚安装了 Visual Web Developer,以便处理我从 Microsoft Visual Studio 2010 转移过来的项目,因为我的试用版已过期,我们将不胜感激任何帮助或潜在的解决方法。
【问题讨论】:
【参考方案1】:我今天遇到了这个问题。据我了解,问题在于 .NET 4.0 程序集现在默认为 security critical。安全透明代码无法调用安全关键代码。
在我的情况下,解决方案与仅在我的应用程序中的几个程序集上定义 AllowPartiallyTrustedCallersAttribute
有关。我必须要么从所有程序集中删除此属性,要么将其添加到所有程序集中。
【讨论】:
我在其他地方读到过类似的东西,虽然我无法成功实施您的修复,但我相信这是正确的回应。 从 AssemblyInfo.cs 中删除 AllowPartiallyTrustedCallersAttribute 对我的解决方案有效。我从未使用最新的 .Net 框架版本的旧程序集中收到错误。 我在将一个大型项目更新到 .Net 4 后遇到了这个问题。它是一个用 AllowPartiallyTrustedCallersAttribute 装饰的 ORM 库(实体空间)。将其注释掉,一切都已修复。谢谢! 当你想写一个插件框架(例如),并且你希望防止插件直接调用方法时,这个特性很有用。不幸的是,默认设置太严格了,使它成为一个真正的 PITA 来实现(向你的类/方法添加许多额外的安全级别的东西)。如果对象被编译进去会很好,父程序集本身可以访问所有方法,并有选择地选择不允许直接与主二进制文件中的方法交互的方法。 (可访问二进制本身) 我今天也有类似的问题。在按照描述解决问题并清理/重建解决方案后,问题仍然存在。原因是“微不足道的”(当然,在我找到它之后):程序集是 GAC-ed,Visual Studio(调试时)和未调试的应用程序加载了 GAC-es 版本,它具有错误的属性。因此,如果您有相同的症状,请检查 GAC 中的程序集,如果发现旧版本,请重新部署新版本。【参考方案2】:您可能需要将以下内容添加到您的 AssemblyInfo.cs 文件中,以便所涉及的程序集相同。
[assembly: SecurityTransparent()]
【讨论】:
这对我有用。我有一个 C# 类库项目 (.Net 4.0) 和一个 Windows Forms VB 项目。我在 C# 库项目的 AssemblyInfo.cs 中添加了“[assembly: SecurityTransparent()]”,问题就消失了。 也为我工作。 Tnks。【参考方案3】:感谢我在这里参加聚会非常晚,但是在 VS2013 中并且在 .NET 4.5.1 ClickOnce 项目中遇到了同样的问题,我通过以下方式解决了这个问题:
-
打开相关 ClickOnce 项目的项目属性
打开“安全”选项卡
将信任设置更改为“这是一个部分信任的应用程序”
将信任设置改回“这是一个完全信任的应用程序”
希望这对其他人有帮助!
【讨论】:
【参考方案4】:显然,至少使我能够在 Visual Web Developer 中启动应用程序的一种潜在解决方法是:
从 位于元素内的元素。
如果是 Silverlight 应用程序,请右键单击 ApplicationName.Web 标头选择属性,然后更改 目标框架到 3.5。如果是asp.net应用对 单击顶部项目标题并选择属性,然后设置 目标框架到 3.5。
所有这些都表明我的 .Net 4.0 框架安装存在问题。但是由于我已经安装和卸载,然后至少安装了 .Net 4.0 框架两次,这是我目前能想到的唯一选择。如果有人为我提供了更好的响应/更永久的解决方案,我会将其标记为答案。与此同时,我将尝试启动“安装其他框架”并再次重新安装 .Net 4.0 目标包和 .Net 4.0 运行时,看看它是否有效。
【讨论】:
以上是关于System.MethodAccessException:尝试通过安全透明方法访问安全关键方法在所有应用程序上失败的主要内容,如果未能解决你的问题,请参考以下文章