security - pinvoking时.NET 4方法安全异常

标签 security .net-4.0 pinvoke

我有一些代码可以调用 native win32。由于我升级到 .NET 4,代码开始抛出 MethodAccessException 说:

Attempt by security transparent method 'Tek.Audio.Midi.MidiDevice.GetDevices()' to call native code through method 'Tek.Native.Windows.Multimedia.midiInGetNumDevs()' failed. Methods must be security critical or security safe-critical to call native code.



这是发生了什么:
  • 可执行程序集的 Program.Main方法调用 library1 public static Tek.Audio.Midi.MidiDevice.GetDevices()
  • 图书馆1的GetDevices()调用 library2 的公共(public)静态 pinvoke Tek.Native.Windows.Multimedia.midiInGetNumDevs() (是的,不好的做法,无论如何)

  • 所涉及的类、方法和程序集上唯一与安全相关的属性是 library1 上的 AllowPartiallyTrustedCallers,我什至不知道为什么。

    承认我对 .NET 的安全性一无所知,这让我感到羞耻。我应该怎么做才能防止这种异常?当我在这里时,有什么好的文章可以让我开始了解 .NET 安全性吗?

    最佳答案

    你有选择。最简单的做法是“选择退出”新的安全模型。

    <configuration>
      <runtime>
        <NetFx40_LegacySecurityPolicy enabled="true" />
      </runtime>
    </configuration>
    
    或(请记住,我不是 .Net 4 安全专家)
    编辑:退出 .Net 4 安全模型是不可靠的,应该避免
    您可以标记您的方法:
    [SecuritySafeCritical]
    
    因为您可以将其与为部分受信任的调用者设计的代码一起使用。
    可悲的是,我没有可以发给你的好文章,我不得不像你一样解决这个问题,通过修复我损坏的代码。 :)

    关于security - pinvoking时.NET 4方法安全异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3256178/

    相关文章:

    vb.net - 将 GUID 转换为数字等效项

    c# - Pinvoke 命令长度不正确

    php - 加密 Ajax 数据的最佳且最安全的方法是什么?

    javascript - 在 JavaScript 中访问原始全局变量和属性

    正则表达式获取两个字符串之间的文本

    c# - 空引用 - 任务 ContinueWith()

    c# - 在从 C# 到 C 的 P/Invoke 调用期间编码输出指针

    c++ - 通过 C#/.NET 代码编写可使用的非托管 DLL

    javascript - 有没有办法在网页中声明所有 javascript http 请求必须仅针对同一主机?

    rest - 公开记录开放 API 是一种好习惯吗?