VC++ .Net Clr/Safe and Clr/Pure

4
在VC++.Net中,“Clr/Safe”(/clr:safe)和“Clr/Pure”(/clr:pure)是什么意思?

从DUMPBIN文档中的附加信息:「/clr:pure」和「/clr:safe」编译器选项在Visual Studio 2015中已被废弃,并且在Visual Studio 2017及以后的版本中不受支持。必须是「pure」或「safe」的代码应该迁移到C#。- https://learn.microsoft.com/en-us/cpp/build/reference/clrheader?view=msvc-170 - sɐunıɔןɐqɐp
2个回答

3
文档中得知: /clr:pure 生成一个仅包含 Microsoft Intermediate Language(MSIL) 的输出文件,没有本地可执行代码。但是,它可以包含编译为 MSIL 的本地类型。 /clr:safe 生成一个仅包含 MSIL 的(没有本地可执行代码),可验证的输出文件。/clr:safe 启用验证诊断(PEVerify 工具 (Peverify.exe))。

这会阻止我从我的C++ CLI程序集内部访问DirectX或win32代码吗? - Gusdor
我也想知道这些是仅仅进行类型检查还是在头部放置了一个标志来标识它们是纯的或者安全的? - Evan Carroll

0

我认为这些信息还不够。从其他答案中看来,似乎只是类型检查。从this doc中可以看出,它远不止于此。

当使用/clr(而不是/clr:pure/clr:safe)且未使用__clrcall时,获取函数地址始终返回本机入口点函数的地址。当使用__clrcall时,不会创建本机入口点函数,因此您将获得托管函数的地址,而不是入口点thunk函数的地址。有关更多信息,请参见Double Thunking。

/clr(公共语言运行时编译)意味着所有函数和函数指针都是__clrcall,编译器不允许将编译单元内的函数标记为除__clrcall之外的任何内容。当使用/clr:pure时,__clrcall仅可在函数指针和外部声明上指定。


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