我有一个Assembly(A),它定义了一个Managed类,它有一个带有两个本机类型的公共构造函数。
我可以访问包含本机类型的Header文件和已编译的lib文件。
我创建了一个C++/CLI
项目,并定义了一个ref class
,其中包含一个返回(A)中定义的公共类型的public: static
方法。
当我尝试通过传入本机类型进行contstruct时,我会收到`C3767'YourType :: TypeB':无法访问候选函数。
我为本机类型及其衍生的任何类型添加了#pragma make_public(Type)
,但仍然没有喜悦。
我的班级标题:
#pragma once
#include "StdAfx.h"
using namespace System;
using namespace AssemblyA;
namespace NativeWrapper {
ref class MyFactory
{
public:
static AssemblyAType^ Build();
};
}
我的cpp文件:
#include "StdAfx.h"
#pragma make_public(nativeObjectRoot)
#pragma make_public(nativeObjectDerived)
#include "MyFactory.h"
using namespace System;
using namespace NativeWrapper;
AssemblyAType^ MyFactory::Build()
{
nativeObjectDerived* myNativeObject;
//myNativeObject initialised and set up here
return gcnew AssemblyAType(myNativeObject); <--C3767
}
我看过,托管类型`AssemblyAType'有一个带有此签名的公共构造函数。似乎无法让pragma工作?
总结一下。
我的C ++ / CLI项目引用第三方程序集,该程序集定义了一种在其构造函数中采用本机类型的类型。我的项目还添加/链接到头文件/ lib文件。
注意:上面的代码并不完全是我所拥有的,但我已经删除了相关部分。
答案 0 :(得分:2)
make_public将为您使用它的程序集的使用者创建本机类型visibile:http://msdn.microsoft.com/en-us/library/ms235607(v=vs.80).aspx。它不会更改您引用的程序集中的可见性。
您引用的程序集似乎应该具有本机类型的make_public,或者只是将本机类型声明为public(请参阅Type visibilty for a header Share a header file shared between native and managed clients)。
以下页面似乎表明他们应该在编写方法时收到警告,而不会将原生类型公开:http://msdn.microsoft.com/en-us/library/ms173713(v=vs.80).aspx
也许你可以发布第三方的AssemblyAType代码,以确保我们没有其他任何东西丢失。