为 C++/CLI 托管类型制作 C# 兼容接口

Making C# compatible interface for C++/CLI managed type

我有一些本机 C/C++ 函数,我在 C++/CLI 中为其创建托管包装器(Visual Studio 2015)。

特别是,我的一种托管类型如下所示:

public ref class MyClass abstract : public IMyClass
{
public:
    virtual void SomeMethod(ID id);
}

类型ID定义为:

typedef unsigned long ID;

由于单元测试的目的,我想在我想与 C++/CLI 世界分开的不同 C# 程序集上为我的包装器类型创建兼容的接口,所以我制作了这个接口:

public interface IMyClass
{
    void SomeMethod(uint id);
}

当我尝试编译托管 C++/CLI 程序集时,出现错误提示我应该为“void SomeMethod(unsigned int)”提供合适的实现。

我在界面上使用了 uint 类型,因为根据这个 MSDN documentationunsigned long 被转换为托管类型 System.UInt32 (uint),但似乎(相反)使用 unsigned long 来实现 uint 不可能。

你们以前有过同样的问题吗?你知道如何解决这个问题吗? 是否可以告诉 C++/CLI 编译器我的 unsigned long 应该被视为 uint 类型?

我无法更改 ID 定义,因为它是本机库的一部分并且被其他函数广泛使用。

如有疑问,请明确。

我建议你在任何地方都使用System::UInt32:当你定义接口类型时,当你实现它时。这将消除定义与实现之间的任何细微不匹配。

在 C++ 领域,intlong 是不同的类型,即使它们的大小相同。实现接口时,参数类型必须完全匹配,32位int和32位long之间的细微差别似乎有所不同。