2

我有一个由混合 C++/CLI 和 C# 代码组成的大型应用程序。在重构过程中,我想在 C# 中创建一个接口,该接口将在 C++/CLI 中继承。没问题,我以前做过很多次。但是我对这个新接口的方法签名有疑问。将从它继承的 C++ 类具有如下所示的方法。

void MethodName(DateTime ^A)

如果 DateTime 是 C# 中的引用类型,我可以用它替换上面的签名。

void MethodName(DateTime A)

问题出现是因为 DateTime 是一种值类型。但是,它是通过句柄访问的。句柄是一个 C++/CLI 概念,我不知道如何将它翻译成 C#。

有谁能告诉我 C# 中需要什么方法签名来解决这个问题?

4

3 回答 3

3

DateTime^在 C++/CLI 中没有直接的 C# 等价物。C# 中不存在这种类型的参数。

ref DateTime很接近,但这将DateTime%在 C++/CLI 中,而不是DateTime^.

如果您可以修改其中包含的源代码,DateTime^请将其更改为DateTimeDateTime%。可能是原作者不知道DateTime不需要^,因此他们可能将该参数用作常规的按值参数,而不是按引用。无论您以哪种方式更改它,都可以从 C# 轻松调用它。

于 2013-05-23T21:18:03.817 回答
2

这是不可能的

ILDasm 显示此方法编译为

void MethodName (
    class [mscorlib]System.ValueType
    modopt([mscorlib]System.DateTime)
    modopt([mscorlib]System.Runtime.CompilerServices.IsBoxed) 
    A
) cil managed 

这在 C# 中是不可能表示的(您不能编码任意 modopt 值;这些不是属性)

Why aren't you just using DateTime without the ^? I don't know what benefit you get from using a handle, since DateTime objects are immutable and small.

于 2013-05-23T21:29:46.120 回答
1

它是一个参考,在 C# 中你应该使用关键字 ref:

void MethodName(ref DateTime A)

希望这对您有所帮助。

于 2013-05-23T21:10:51.600 回答