我有一些代码可以调用 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()
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/