【问题标题】:Adding #pragma make_public(Type) not removing C3767 error添加 #pragma make_public(Type) 不删除 C3767 错误
【发布时间】:2012-02-08 17:26:58
【问题描述】:

我有一个 Assembly(A),它定义了一个托管类,该类具有一个公共构造函数,该构造函数采用两种本机类型。

我可以访问包含本机类型的头文件和编译的 lib 文件。

我创建了一个C++/CLI 项目并定义了一个ref class,其中包含一个返回(A) 中定义的公共类型的public: static 方法。

当我尝试通过传入本机类型进行构造时,我收到 `C3767 'YourType::TypeB': Candidate function(s) not access.

我已经为原生类型和它们派生的任何类型添加了#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”有一个带有此签名的公共构造函数。似乎无法使编译指示起作用??

总结一下。

我的 C++/CLI 项目引用了第 3 方程序集,该程序集定义了在其构造函数中采用本机类型的类型。我的项目还添加/链接到头文件/lib 文件。

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

【问题讨论】:

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


【解决方案1】:

make_public 将使本机类型对您使用它的程序集的消费者可见: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 代码,以确保我们没有遗漏任何其他内容。

【讨论】:

  • 我可以访问头文件,并且我已将类更改为公开但#pragma make_public(type) 仍然没有工作。
  • 您正在访问的方法是一个托管方法——不是本机方法,因此它通过您对程序集的引用和该程序集的元数据来查找该方法(它不使用标题来查找它) .因此,在程序集 A 中,本机类型必须是公共的(通过 make_public 或通过正常使用公共)。如果你不能修改 AssemblyA,我认为你运气不好。
  • 因此,如果您可以访问 AssemblyA 的源代码,则需要将本机类型公开(通过在它们前面加上 public 或使用 make_public),然后构建 AssemblyA。然后,当您引用 AssemblyA 时,这些类型将是公共的。
  • 好的,我明白了。 AssemblyA 和我的程序集都使用本机库,AssemblyA 按原样提供(构建在本机库之上,然后提供给我)。所以从你说的看,我运气不好。
  • 我想是的。制作 AssemblyA 的人在编译时应该收到警告。我认为即使您无法通过使用反射“访问”该方法,您也可以调用该方法(不过,我怀疑您是否愿意采用这种方法)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 2010-10-31
相关资源
最近更新 更多