它在C#方面意味着什么?

时间:2013-12-24 08:15:34

标签: c# .net decompiler dotpeek

我发现以下编译器生成的代码使用DotPeek分析.NET程序集之一:

[UnsafeValueType, NativeCppClass]
[StructLayout(LayoutKind.Sequential, Size = 16)]
internal struct DWriteTextAnalysisNode<MS::Internal::Text::TextInterface::Native::IDWriteNumberSubstitution *>
{
}

我想知道它意味着什么?如何在C#中重写它?特别是这部分:

<MS::Internal::Text::TextInterface::Native::IDWriteNumberSubstitution *>

1 个答案:

答案 0 :(得分:7)

您在PresentationCore.dll中找到了这个。您正在查看使用C ++ / CLI编写的代码,而不是C#。它是C#和VB.NET之外的三种主要Microsoft .NET语言之一。绝对是丑陋的继女,C ++ / CLI的存在理由是它具有与C或C ++编写的本机代码交互的无与伦比的能力。

它在PresentationCore,System.Data中得到了很多用处,它包含了大量的本机代码互操作,以利用现有的Microsoft apis。在这种情况下,它是DirectWrite,一个文本呈现api。它是一个相当复杂的原生api,远远超出了标准pinvoke的互操作能力。 C ++ / CLI支持直接使用本机COM样式接口。

C ++ / CLI的一个方面是本机C ++接口和类可以渗透到程序集元数据中。这是一个缺陷,它没有很好的方法来抑制本机类型的可见性。只有相反,使#pragma make_public可见。 C ++ / CLI编译器必须为与程序集元数据兼容的类型生成元数据定义。由于这些是本机类型,因此最接近的合理匹配是值类型。它完全不透明,你没有看到类型的成员。只是一个blob,非常类似于C#中的固定大小缓冲区类型。

所以这只是一件神器。在C#中做同样的事情没有明智的方法,也没有理由。