在c#中使用IJW防止导入非托管类

时间:2015-03-29 15:35:36

标签: c# c++ interop

我在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。其中BC为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的编译。

0 个答案:

没有答案