2013-12-24 14 views
1

я нашел следующий компилятор сгенерированный код, используя DotPeek анализа одного из сборок .NET:Что это означает с точки зрения C#?

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

мне интересно, что это значит? Как переписать это на C#? Особенно в этой части:

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

IDWriteNumberSubstitution us COM-интерфейс. Остальное название звучит просто как искусственный квалификатор –

+1

Этот код уже в C# –

+0

Что здесь означают угловые скобки и значки звезд? –

ответ

6

Вы нашли это обратно в PresentationCore.dll. Вы смотрите на код, написанный на C++/CLI, а не на C#. Это один из трех основных языков Microsoft .NET, помимо C# и VB.NET. Определенно, уродливая ступенька дочери, причина C++/CLI для существования - это ее непревзойденная способность взаимодействовать с нативным кодом, написанным на C или C++.

Это очень полезно использовать в PresentationCore, System.Data, а также содержит сложный встроенный код для использования существующей Microsoft apis. В этом случае это DirectWrite, текстовый рендеринг api. Это довольно сложный native api, который превосходит возможности стандартного pinvoke для взаимодействия. C++/CLI поддерживает непосредственно встроенные интерфейсы COM-стиля.

Одним из аспектов C++/CLI является то, что интерфейсы и классы на C++ могут проникать в метаданные сборки. Это немного недостаток, у него нет отличного способа подавить видимость родных типов. Только наоборот, делая их видимыми с #pragma make_public. Компилятор C++/CLI должен генерировать определение метаданных для типа, совместимого с метаданными сборки. Так как это родные типы под капотом, ближайший разумный совпадение - это значение типа. Он полностью непрозрачен, вы не видите членов этого типа. Просто blob, довольно похожий на тип буфера фиксированного размера в C#.

Так что это всего лишь артефакт. В C# нет разумного способа сделать то же самое, и нет причин для этого.

Смежные вопросы