2012-06-05 3 views
3

В каркасе .Net у меня создается впечатление, что вы можете написать библиотеку на одном языке (например, C++), затем импортировать этот код и использовать эту библиотеку в другом проекте C# (предполагая, что оба они нацелены на одну и ту же версию фреймворка).Как взаимодействует язык в .Net?

Однако я не понимаю, как это работает, когда могут быть методы, определенные в C++, которые не имеют смысла на каком-либо другом языке, таком как C# или VB.net, например, параметр метода, который принимает структуру, которая не является 'Указатель.

Возможно, мой пример не задерживается из-за моих ограниченных знаний обо всех языках CLR, но я должен предположить, что есть вещи, которые один язык может сделать, а другой не может - и я не понимаю, как эти расхождения рассматриваются.

ответ

3

Вполне возможно создать метод, класс, структуру, тип или что-либо другое на одном языке .NET, который не может быть вызван другим напрямую. Вызывать его косвенно (с помощью рефлексии, например) всегда возможно.

I.e., если вы посмотрите на любой скомпилированный проект C#, вы увидите, что скомпилированный код содержит в себе некоторый код со странными именами и символами, обычно для поддержки дженериков. Одно из таких имен - <Module> (включая скобки), которое, даже если оно было сделано публичным методом, никогда не может быть вызвано непосредственно из C#.

Разработчики языка, которые решают скомпилировать для CLR, должны поддерживать минимальное подмножество для общедоступных типов. Это называется CLS Compliance и составляет около a common naming convention, без публичных указателей или публичных небезопасных членов или классов, без имен, которые отличаются только по отдельности, не имеют открытых статических полей и some more rules. Когда они подчиняются этому правилу, гарантируется, что любой другой язык .NET может вызывать ваши методы. Они знают, как это сделать, потому что правила для этого хорошо изложены и задокументированы.

Вы даже можете создать non-compliant C# code. Он будет (обычно) компилироваться, но не гарантируется, что все совместимые языки могут вызвать ваш метод. То же самое верно для большинства других языков, включая C++. NET. Это Microsoft Design Guideline to mark your assemblies as CLSCompliant by default (независимо от того, написано ли это на C++, VB, Ruby не имеет значения).

2

Существуют различные типы языковых взаимодействий, поддерживаемые платформой .NET. Во-первых, это то, о чем говорит Абель, компилятор .NET должен генерировать сборки, формат которых описан в спецификации CLI. Стандартизирован как Ecma-335 со строгими описаниями метаданных (описания типов) и кода (IL или промежуточный язык). Это упрощает взаимодействие, один компилятор языка может читать типы другого, а среда выполнения .NET позволяет им работать вместе.

Но вы говорите о C++, это не управляемый язык. Это требует взаимодействия с собственным кодом. Это не технически очень сложно, ведь дрожание также генерирует собственный код. Вам просто нужен способ, чтобы описал собственный код, поэтому есть разумные шансы на успех. Есть три способа:

  • Вы можете объявить функции, написанные на родном коде с [DllImport] атрибута. Это работает для языковых циклов, которые вызывают интерфейс вызова стиля C. API Windows такой. Это не включает C++, по крайней мере, когда вы не пользуетесь поддержкой своих классов.

  • CLR имеет хорошую поддержку для COM, великого отца .NET и раннего языкового стандарта взаимодействия, реализованного Microsoft.В частности, подмножество COM Automation работает хорошо, вы можете просто добавить ссылку на библиотеку типов COM-компонента, а инструментарий .NET автоматически генерирует клей, чтобы подвергнуть объектную модель COM, реализованную компонентом, как управляемые. Такой способ взаимодействия работает так же, как и все, что вы найдете на вкладке COM диалогового окна Добавить ссылку. То, что может работать над кодом, написанным на C++, хотя COM конечно не требует, чтобы COM-компонент был написан на C++. VB6 и Delphi - известные языки, которые хорошо поддерживают COM. И наоборот, вы можете легко выставить .NET-код как COM для других сред выполнения. WinRT api, тот, который позволяет вам писать приложения Metro, работающие в Windows 8, основан на базе COM, хотя он хорошо скрыт в языковых прогнозах.

  • Конечный инструмент взаимодействия и тот, который вам нужно использовать для создания кода на C++, является языком C++/CLI. Это расширение, встроенное в компилятор Microsoft C++, который позволяет скомпилировать собственный код на C++ в IL и храниться в сборке. С возможностью объявлять управляемые классы в синтаксисе стиля C++, классы, которые непосредственно используются управляемым кодом, и которые могут создавать собственные объекты класса C++ и вызывать их методы. Таким образом были созданы несколько частей платформы .NET, в частности mscorlib, System.Data и PresentationManager, куски кода, которые имеют сильную зависимость от собственного кода, чтобы выполнить свою работу. Подумайте о C++/CLI как о конечном языке клея.

+0

Четкий ответ, как всегда;). Однако я был в предположении, что OP означал, что он хотел использовать Managed C++, как в вашем третьем варианте, потому что он написал _ «предполагая, что оба они нацелены на одну и ту же версию рамки» _. Поэтому я сосредоточен на CLI. – Abel

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