添加#pragma make_public(Type)不会删除C3767错误

时间:2012-02-08 17:26:59

标签: visual-studio-2010 c++-cli

我有一个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文件。

注意:上面的代码并不完全是我所拥有的,但我已经删除了相关部分。

1 个答案:

答案 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代码,以确保我们没有其他任何东西丢失。