Mik*_*hke 2 c# c++ c++-cli pragma visual-studio
在一个复杂的解决方案中,我混合了本机 C++ 库、C++/CLI 包装器和 C# 程序集。在包装器中,我经常必须使用本机类型,因此我必须使用#pragma make_public. 然而,这些编译指示的问题是,您经常会遇到链接器错误 LNK2022,如此处和此处(以及许多其他地方)所讨论的。
通常的解决方案是将所有编译指示收集在一处,以避免重复类型错误。到目前为止,我发现的唯一可靠的地方是将列表放入我的stdafx.h头文件中。然而,这很烦人,因为一旦我必须在那里添加新的本机类型(这是我的预编译头),它就会导致我的整个项目重新编译。
我想将该列表提取到单独的标头中,或者更好的是 cpp 文件中。但到目前为止我的尝试还没有奏效。未公开的类型。看来我还必须将#pragma make_public调用放入头文件中。不过我更喜欢cpp。
那么,还存在哪些其他可能性呢?其他人在哪里拨打#pragma make_public电话?
我在包含引入类型的 .h 文件后直接放置了 pragma:
#include "native_type.h"
#pragma make_public(Native_Struct_1)
Run Code Online (Sandbox Code Playgroud)
我仅在类型不是我控制的类型的情况下使用编译指示。如果该类型是我控制的类型,那么我只需使用以下预处理器帮助程序将该类型标记为公共(以允许它由启用 cli 的代码或不启用 cli 的代码编译):
#ifdef __cplusplus_cli
#define CLR_ASSEMBLY_ACCESS_SPECIFIER__Public public
#else
#define CLR_ASSEMBLY_ACCESS_SPECIFIER__Public
#endif
Run Code Online (Sandbox Code Playgroud)
用法:
CLR_ASSEMBLY_ACCESS_SPECIFIER__Public
class NativeClass
{
};
Run Code Online (Sandbox Code Playgroud)
编辑:
示例1:
仅本机库 A.dll 具有标头 ah,其中包含以下类声明:
CLR_ASSEMBLY_ACCESS_SPECIFIER__Public
class TypeA
{
};
Run Code Online (Sandbox Code Playgroud)
当在库 A.dll 中编译时,CLR_ASSEMBLY_ACCESS_SPECIFIER__Public编译结果为空。并且本机 dll 中不存在托管可见性的概念。
当该类在 c++/cli 程序集 B.dll 中使用,并且标头 ah 在 /clr 编译的源文件中时,将编译CLR_ASSEMBLY_ACCESS_SPECIFIER__Public为 B.dllpublic并TypeA从 B.dll 变为公共。make_public通过在 B.dll 的源代码中使用而不是使用,会发生等效的情况CLR_ASSEMBLY_ACCESS_SPECIFIER__Public.
示例 2:现在,假设 Ah 没有使用CLR_ASSEMBLY_ACCESS_SPECIFIER__Public。并且,假设在 B.dll 中,我们包含 Ah 但不使用make_public. 另外,假设我们公开了一个包含 TypeA 的托管方法:
public ref class ManagedTypeB
{
public: void Foo(TypeA * pA);
};
Run Code Online (Sandbox Code Playgroud)
现在,考虑引用 B.dll 的托管程序集 C.dll。它无法调用ManagedTypeB::Foo(即使它是公共的),因为 TypeA 在 B.dll 中是私有的。此外,无法从C.dll 的源代码中修复此问题。即,C.dll 的源代码不能用于make_public使 B.dll 的 TypeA 公开。在这种情况下,必须更改 B.dll 的源才能使其Foo可调用。
| 归档时间: |
|
| 查看次数: |
1797 次 |
| 最近记录: |