我在 C++/CLI 程序集 (MyAssembly) 中有一个公共 ref 类,其中包含一个接受本机参数的公共静态方法。
#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 用于非模板化的本地类型(例如 nativeTypeA)并且它可以工作(即编译 CallingAssembly 时没有 C4679)。我没有使用 make_public,而是将本机类声明为 public,并按照本文中的建议通过预处理器指令在本机标头中使用 __declspec(dllexport )。还需要有条件地排除“public”修饰符(通过 CLR_ACCESS_MODIFIER),因为该类也包含在其他本地项目中:
#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 在 MyAssembly 中定义;我在 CallingAssembly 中添加了对 MyAssembly 的引用,并将 MyAssembly.lib 添加到其链接行。项目构建顺序是正确的,并且没有缺少依赖项,但我仍然得到 C4679。
我可以更改接口以接受非模板类型,但我真的不想这样做,因为它会导致代码膨胀并且不那么优雅。 这篇文章提到在我的本机课程中正常使用“公共”应该有效。
任何人都可以帮忙吗?
提前致谢!