C++/CLI 在程序集中导出全局符号

C++/CLI exporting global symbols in assembly

我遇到了这样一种情况,我无法更改在全局范围内声明多个符号的 CLI header,然后这些符号被命名空间内的函数使用,并且该函数在我需要使用的程序集中导出。

下面是一些 puedo 代码来帮助说明 Visual Studio 设置。此外,我正在使用 2008 工具链,它是 C++11 之前的工具链,使 'enum class' 成为托管的 object。另请注意,它也没有使其成为私有的访问说明符(我没有写这个)。

ExportingAssembly.vcxproj
|->SomeHeader.h
| |->enum class SomeSymbol
|->SomeSource.c
  |->SomeNamespace
    |->void SomeFunction(SomeSymbol arg)

ImportingAssembly.vcxproj
|->Ref ExportingAssembly
|->ImportingSource.c
  |->Using SomeNamespace;
  |->void MyFu(){ SomeSumbol a = 0; SomeFunction(a); }

问题是这些全局符号显然对导入的程序集不可见,如果我为这些符号包含 header,则会导致我的程序集与我正在导入的程序集不兼容

error C2664: 'ExportAssemblyNamespace::SomeFunction(SomeSymbol arg)': can't   
convert parameter 1 from 'SomeSymbol" to 'SomeSymbol'

现在我可以更改导出的程序集(项目文件 and/or 源文件)所以我只希望我能以某种方式使这些全局符号成为导出程序集命名空间的一部分,以便导入程序集能够看到它们.或者失败了,以某种方式在导出的程序集中找到全局符号(我可以看到全局符号在 PE 元数据表中)。

任何想法。或者没有访问说明符的符号是私有的并且无法通过引用程序集来使用?

Or is a symbol without an access specifier private and impossible to make use of via referencing the assembly?

是的,没有访问说明符的符号是私有的。不太好用"impossible";唯一的方法是通过反思。

有些东西在命名空间中,有些则没有,这一点在这里无关紧要。但是您应该将函数作为 class 的一部分,因为全局函数不是 CLR 的一部分。 (C++/CLI 创建了一个 class 来保存全局函数,但它不是 public class,而且我认为它的名称无效。)

将关键字 public 添加到您的枚举中,并将您的函数包含在 public ref class 中。