1

我发现以下使用 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 *>
4

1 回答 1

7

您在 PresentationCore.dll 中找到了它。您正在查看用 C++/CLI 而非 C# 编写的代码。它是除 C# 和 VB.NET 之外的三种主要 Microsoft .NET 语言之一。绝对是丑陋的继女,C++/CLI 存在的原因是它无与伦比的与用 C 或 C++ 编写的本机代码互操作的能力。

它在 PresentationCore、System.Data 中也有很多用途,它包含大量的本机代码互操作,以利用现有的 Microsoft api。在这种情况下,它是DirectWrite,一个文本渲染 api。这是一个非常复杂的原生 api,远远超出了标准 pinvoke 的互操作能力。C++/CLI 支持直接使用本机 COM 风格的接口。

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

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

于 2013-12-24T10:57:31.520 回答