我在C#代码和C ++框架之间使用了IJW层。
C#--references - > IJW - 参考 - > C ++
我的问题是C ++代码中名称空间内的类被导入到C#代码中作为-inaccessible- empty System.ValueType's。这在intellisense中创建了很多假关键字,并给了我一些名字冲突。
这可以通过将所有包装在一个主命名空间中的非托管C ++代码中来解决,但我更倾向于避免使用该解决方案而只是..不,导入那些无用的命名空间。
我使用Visual Studio 2013 Community Edition中的3个不同项目制作了Minimal Working Example。其中B
和C
为dll,A
为exe。正如您所看到的,在A.cs中,using C;
不会导致任何错误,因为导入了名称空间C
,它只是空的。
Here是VS2013装配体资源管理器中装配体的图像。
编辑: 正如Hans Passant所指出的,仅仅因为代码在非托管DLL中,并不意味着它被编译为非托管代码。
当它#imported到C ++ / CLI dll时,它用/ clr选项编译,即托管代码。
因此,为了防止使用/ clr编译代码,必须告诉编译器它是非托管代码。
在MWE中修复它的必要变更:
// #pragma unmanaged
// push managed state on to stack and set unmanaged state
#pragma managed(push, off)
#include "Sample.h"
// #pragma managed
#pragma managed(pop)
我删除了这个作为答案,因为它似乎无法解决它。我认为它确实如此,但那是因为我意外地对源进行了更改,阻止了非托管DLL的编译。