c++-cli - 导出 C++/CLI native 类 (C4679)

我在 C++/CLI 程序集 (MyAssembly) 中有一个公共(public)引用类,其中包含一个接受 native 参数的公共(public)静态方法。

#pragma make_public(nativeTypeA)

namespace namespaceA
{ 
    public ref class MyClass : namespaceB::MyClass
    {
    public:
        static managedTypeA ^ MethodA(nativeTypeA param);
        static managedTypeB ^ MethodB(nativeTypeB param);
    }
}

我想将此方法公开给另一个 C++/CLI 程序集。托管程序集编译正常,但引用它的程序集 (CallingAssembly) 为 MethodB 生成以下警告:

warning C4679: 'namespaceA::MyClass::MethodB' : could not import member
This diagnostic occurred while importing type 'namespaceA::MyClass ' from assembly 'MyAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. 

我不能在 nativeTypeB 上使用 make_public,因为它是模板类的 typedef,但是,我将 make_public 用于非模板 native 类型(例如 nativeTypeA)并且它有效(即编译 CallingAssembly 时没有 C4679)。我没有使用 make_public,而是按照 this 中的建议,通过预处理器指令将 native 类声明为 public 并在 native 头文件中使用了 __declspec(dllexport)。邮政。还需要有条件地排除“public”修饰符(通过 CLR_ACCESS_MODIFIER),因为该类也包含在其他 native 项目中:

#ifdef MANAGED
#define CLR_ACCESS_MODIFIER public 
#ifdef MYASSEMBLY_DEF
    #define MYASSEMBLY_LINKAGE __declspec(dllexport)
#else
    #define MYASSEMBLY_LINKAGE __declspec(dllimport)
#endif
#else
#define MYASSEMBLY_LINKAGE
#define CLR_ACCESS_MODIFIER
#endif

template<>
CLR_ACCESS_MODIFIER class MYASSEMBLY_LINKAGE nativeTypeB<TT> : public nativeTypeB_base<TT> {
...
}

我还为 nativeTypeB 的基类(编译所必需的)及其 typedef 完成了此操作:

typedef public nativeTypeB<TT> MYASSEMBLY_LINKAGE nativeTypeB;

我不确定上面的行是否必要,但 C4679 仍然会出现。

我已经完成了常规检查:两个项目都定义了 MANAGED 预处理器指令; MYASSEMBLY_DEF定义在My​​Assembly中;并且我在 CallingAssembly 中添加了对 MyAssembly 的引用,并在其链接行中添加了 MyAssembly.lib。项目构建顺序正确,没有缺少依赖项,但我仍然得到 C4679。

我可以更改接口(interface)以接受非模板类型,但我真的不想这样做,因为它会导致代码膨胀并且不够优雅。 This帖子提到在我的本地类中正常使用“public”应该可行。

有人能帮忙吗?

提前致谢!

最佳答案

跨 DLL 边界传递 native 类的对象从来都不是一个好主意,因为它非常很容易违反单一定义规则。

C++/CLI 对此没有任何帮助,相反,它提供了生成托管类型的能力,这些托管类型专门设计用于跨程序集共享。它还可以防止您因共享 native 类型而招致灾难(违反 ODR)。您可以使用 make_public pragma 来覆盖它,但有限制(例如没有模板)。

共享 native 类型的更好方法是通过 COM 风格的接口(interface)。

关于c++-cli - 导出 C++/CLI native 类 (C4679),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17252240/

相关文章:

android-layout - 在滑动选项卡中水平滚动 : android

xaml - Telerik RadMaskedNumericInput 掩码

ajax - 我可以添加 Access-Control-Allow-Origin : * to th

python - Selenium:FirefoxProfile 异常无法加载配置文件

macos - 运行 make 时如何修复 ranlib/libtool 错误

sql-server - 在 SQL Server 中的数字字段上没有聚合的数据透视

ruby-on-rails - 如何加入 Rails 中的多对多表

php - 强制文件下载代码在本地主机上工作,但在 php 中的实际服务器上不工作

nginx - 如何替换 HTTP 请求 URI 中的特殊字符?

ruby-on-rails - rails 和 Heroku : Running a script