用C#来表示它意味着什么?

用C#来表示它意味着什么?,c#,.net,decompiler,dotpeek,C#,.net,Decompiler,Dotpeek,我在分析一个.NET程序集时发现以下编译器使用DotPeek生成的代码: [UnsafeValueType, NativeCppClass] [StructLayout(LayoutKind.Sequential, Size = 16)] internal struct DWriteTextAnalysisNode<MS::Internal::Text::TextInterface::Native::IDWriteNumberSubstitution *> { } [UnsafeV

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

[UnsafeValueType, NativeCppClass]
[StructLayout(LayoutKind.Sequential, Size = 16)]
internal struct DWriteTextAnalysisNode<MS::Internal::Text::TextInterface::Native::IDWriteNumberSubstitution *>
{
}
[UnsafeValueType,nativecpclass]
[StructLayout(LayoutKind.Sequential,Size=16)]
内部结构DWriteTextAnalysisNode
{
}
我想知道这是什么意思?如何用C#重写这个?特别是这一部分:

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

您在PresentationCore.dll中找到了这个。您看到的是用C++/CLI编写的代码,而不是用C#编写的代码。除了C#和VB.NET之外,它还是微软的三大.NET语言之一。当然,丑陋的步女儿C++/CLI的原因是它与C++或C++编写的本机代码的互操作能力无可比拟。 它在PresentationCore、System.Data中也得到了大量的使用,它包含大量的本机代码互操作,以利用现有的Microsoft API。在本例中,它是一个文本呈现api。这是一个非常复杂的本机api,远远超出了标准pinvoke的互操作能力。C++/CLI支持直接使用本机COM样式接口

C++的一个方面是,本地C++接口和类可以渗入程序集元数据。这是一个缺陷,它并没有一个很好的方法来抑制本机类型的可见性。相反,使用

#pragma make_public
使其可见。C++/CLI编译器必须为与程序集元数据兼容的类型生成元数据定义。由于这些都是隐藏的本机类型,最接近的合理匹配是值类型。它是完全不透明的,您看不到类型的成员。只是一个blob,与C#中的固定大小缓冲区类型非常相似


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

您在PresentationCore.dll中找到了这一点。您看到的是用C++/CLI编写的代码,而不是用C#编写的代码。除了C#和VB.NET之外,它还是微软的三大.NET语言之一。当然,丑陋的步女儿C++/CLI的原因是它与C++或C++编写的本机代码的互操作能力无可比拟。 它在PresentationCore、System.Data中也得到了大量的使用,它包含大量的本机代码互操作,以利用现有的Microsoft API。在本例中,它是一个文本呈现api。这是一个非常复杂的本机api,远远超出了标准pinvoke的互操作能力。C++/CLI支持直接使用本机COM样式接口

C++的一个方面是,本地C++接口和类可以渗入程序集元数据。这是一个缺陷,它并没有一个很好的方法来抑制本机类型的可见性。相反,使用

#pragma make_public
使其可见。C++/CLI编译器必须为与程序集元数据兼容的类型生成元数据定义。由于这些都是隐藏的本机类型,最接近的合理匹配是值类型。它是完全不透明的,您看不到类型的成员。只是一个blob,与C#中的固定大小缓冲区类型非常相似


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

IDWriteEnumber替代我们的COM接口。这个名字听起来像是一个人工限定词。这个代码已经在C中了。角括号和星号是什么意思?”屈阿纳尔:C++模板与C泛型不太相同。因为使用不同的参数可以从根本上改变对模板的解释,C++基本上必须为它所使用的模板名称和类型参数的每一个组合创建一个新类。@屈帕德:因为它不是C代码。你没有看到他们编写的代码;您将其视为DotPeek的C香味反编译器对其进行了解释。idWriteEnumbers替代了我们的COM接口。这个名字听起来像是一个人工限定词。这个代码已经在C中了。角括号和星号是什么意思?”屈阿纳尔:C++模板与C泛型不太相同。因为使用不同的参数可以从根本上改变对模板的解释,C++基本上必须为它所使用的模板名称和类型参数的每一个组合创建一个新类。@屈帕德:因为它不是C代码。你没有看到他们编写的代码;您将其视为DotPeek的C香味反编译器对其进行的解释。