C ++ / CLI在程序集

时间:2016-03-07 12:24:58

标签: c++-cli

我遇到的情况是我无法更改在全局范围内声明多个符号的CLI标头,然后这些符号由名称空间内的IS函数使用,并且该函数在我需要使用的程序集中导出。

下面是一些puedo代码,以帮助说明Visual Studio设置。另外,我使用了2008年的工具链,它是C ++ 11之前制作的“enum class'一个托管对象。另请注意,它也没有访问说明符(我没有写这个),这使得它变为私有。

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); }

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

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

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

任何想法。或者是一个没有访问说明符私有的符号,并且不可能通过引用程序集来使用它?

1 个答案:

答案 0 :(得分:1)

  

或者是没有访问说明符的符号是私有的,并且不可能通过引用程序集来使用它?

是的,没有访问说明符的符号是私有的。利用它并不是“不可能”;唯一的方法是通过反思。

事实上,你在命名空间中有一些东西,而有些东西没有,这里并不重要。但是你应该将你的函数作为类的一部分,因为全局函数不是CLR的一部分。 (C ++ / CLI创建了一个用于保存全局函数的类,但它不是公共类,我认为它的名称无效。)

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