系统。MethodAccessException:透明安全方法尝试访问所有应用程序上的安全关键方法失败

19

您好,在此先感谢您的帮助。 我知道这个问题或类似的问题已经发布了很多次,特别是针对MVC 3应用程序。然而,每当我尝试在Visual Web Developer Express 2010中使用.NET 4.0目标框架启动任何应用程序时,都会出现以下错误信息:

确切的错误提示如下:

尝试使用安全透明方法“System.Runtime.Diagnostics.DiagnosticTrace..ctor(System.String, System.Guid)”访问安全关键方法“System.Runtime.Diagnostics.EtwDiagnosticTrace..ctor(System.String, System.Guid)”失败。

程序集“System.ServiceModel.Internals、版本=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 - 是否可以指定使用哪个 .NET 版本来运行可执行文件? 我尝试修复了 .Net 4.0 框架的安装,因为我听说可能会出现问题。 昨晚我刚刚安装了 Visual Web Developer,以便于处理我从 Microsoft Visual Studio 2010 移植过来的项目,因为我的试用版已经过期了。如果有帮助或潜在解决方法,将不胜感激。

4个回答

18

我今天遇到了这个问题。就我所了解的情况而言,问题在于.NET 4.0程序集现在默认为security critical。安全透明代码无法调用安全关键代码。

在我的情况下,解决方案与我的应用程序中只有一些程序集定义了AllowPartiallyTrustedCallersAttribute有关。我必须从所有程序集中删除此属性,或将其添加到所有程序集中。


我在其他地方读过类似的内容,虽然我没有成功地实现你的修复方案,但我认为这是正确的答案。 - Christian
1
从 AssemblyInfo.cs 中删除 AllowPartiallyTrustedCallersAttribute 对我的解决方案有帮助。我之前得到了一个错误,是由于老旧的程序集并没有使用最新版本的 .Net Framework 引起的。 - Apogee
我在将一个大型项目更新为.Net 4后遇到了这个问题。 这是一个带有AllowPartiallyTrustedCallersAttribute的ORM库(Entity Spaces)。 我将其注释掉,一切都解决了。谢谢! - scubasteve
当您想编写插件框架并希望防止插件直接调用方法时,此功能非常有用。不幸的是,默认设置过于严格,使得实现变得非常麻烦(需要向类/方法添加大量额外的安全级别内容)。如果对象被编译进入,那么父程序集本身将可以访问所有方法,并选择不允许直接与主二进制文件中的方法进行交互的方法。(对二进制文件本身可访问) - Kraang Prime
我今天遇到了类似的问题。按照描述修复问题并清理/重建解决方案后,问题仍然存在。原因是“琐碎的”(当然,在我找到它之后):程序集已经被GAC安装,并且Visual Studio(在调试时)和不带调试的应用程序加载了GAC版本,该版本具有错误的属性。因此,如果您有相同的症状,请检查GAC中的程序集,并重新部署新版本(如果找到旧版本)。 - pholpar

3

很抱歉我来晚了,但在使用VS2013并遇到.NET 4.5.1 ClickOnce项目的相同问题时,我通过以下方式解决了这个问题:

  1. 打开相关ClickOnce项目的项目属性
  2. 打开安全选项卡
  3. 将信任设置更改为“这是部分信任应用程序”
  4. 将信任设置更改回“这是完全信任应用程序”

希望这能帮助其他人!


2
您可能需要在AssemblyInfo.cs文件中添加以下内容,以确保相关程序集相同。
[assembly: SecurityTransparent()]

这对我很有效。我有一个C#类库项目(.Net 4.0)和一个Windows Forms VB项目。我在C#库项目的AssemblyInfo.cs中添加了"[assembly: SecurityTransparent()]",问题就消失了。 - Crispy Ninja
我也试过了,有效。谢谢。 - Washington Morais

0

显然,至少让我能够在Visual Web Developer中启动应用程序的一个潜在解决方法是:

  • 从位于元素内的元素中删除targetFramework="4.0"属性。

  • 如果它是Silverlight应用程序,请右键单击ApplicationName.Web标题,选择属性,然后将目标框架更改为3.5。如果它是asp.net应用程序,请右键单击顶部项目标题,选择属性,然后将目标框架设置为3.5。

所有这些都让我想到了我的.Net 4.0框架安装存在问题。但由于我已经安装和卸载了至少两次.Net 4.0框架,这是我目前唯一能想到的选项。如果有人为我提供更好的响应/更持久的解决方案,我会将其标记为答案。同时,我将尝试启动“安装其他框架”,并重新安装.Net 4.0定位包和.Net 4.0运行时,以查看是否有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接