如何在C#中编译不安全代码

5

我已经导入了一个API函数,例如:

[DllImport("gdi32.dll")]
private unsafe static extern bool SetDeviceGammaRamp(Int32 hdc, void* ramp);

编译时出现错误,例如

Unsafe code may only appear if compiling with /unsafe

如何使用/unsafe编译。我正在使用Microsoft Visual Studio 2008

有人可以帮我提供更好的解决方案吗?

提前感谢您的帮助。

3个回答

13

在项目上右键点击,选择属性。选择构建选项卡。勾选允许不安全的代码。


不要右键单击项目名称以打开其菜单,这样您就可以转到属性。 - Catalin Florea
哦,我以为菜单在工具栏里。不过无论如何我们都可以使用,对吧? - Thorin Oakenshield
在解决方案资源管理器中。抱歉,我忘记提到了。 - Catalin Florea

3

只需从声明中删除unsafe关键字即可。像这样的Windows API函数并不是不安全的。您可以通过以下方式摆脱笨拙的void*(在托管代码中为IntPtr):

    private struct RAMP {
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
        public UInt16[] Red;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
        public UInt16[] Green;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
        public UInt16[] Blue;
    }

    [DllImport("gdi32.dll")]
    private static extern bool SetDeviceGammaRamp(IntPtr hDC, ref RAMP lpRamp);

还要注意第一个参数是句柄,即IntPtr,而不是Int32。这是为了使该代码在64位操作系统上正常运行。


2
如果有人需要,这里是屏幕截图。 UnsafeCodeImage

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