Подтвердить что ты не робот

.NET Module vs Assembly

Я пытаюсь обернуть голову "правильным" ответом на это? есть несколько тем в stackoverflow, которые покрывают это, но это несколько конфликтует с документацией msdn.

например, обратите внимание на диаграмму во втором ответе на его вопрос: Что такое управляемый модуль (по сравнению с сборкой)?

Теперь посмотрим на диаграмму msdn: http://msdn.microsoft.com/en-us/library/zst29sk2(VS.100).aspx

диаграмма msdn подразумевает, что однофайловая сборка не содержит модуля, а скорее метаданные манифеста, il code, type и т.д. Это отличается от многих других прочитанных мной статей, в которых говорится, что одна файловая сборка имеет один модуль.

Каков ответ? Если ответ "оба", то является ли модуль отдельным физическим файлом, связанным через манифест сборки?

4b9b3361

Ответ 1

Каждая сборка имеет хотя бы один модуль. Это деталь реализации, которая очень невидима. Но вы можете видеть это, когда используете Reflection.Emit. Из примера кода для класса AssemblyBuilder:

AssemblyName aName = new AssemblyName("DynamicAssemblyExample");
AssemblyBuilder ab = 
    AppDomain.CurrentDomain.DefineDynamicAssembly(
        aName, 
        AssemblyBuilderAccess.RunAndSave);

// For a single-module assembly, the module name is usually
// the assembly name plus an extension.
ModuleBuilder mb = 
    ab.DefineDynamicModule(aName.Name, aName.Name + ".dll");

TypeBuilder tb = mb.DefineType(
    "MyDynamicType", 
     TypeAttributes.Public);

Обратите внимание на использование класса ModuleBuilder, типы добавляются в модуль. То, что сборка может содержать несколько модулей, довольно неуместна, среда сборки не поддерживает ее. MSBuild не поддерживает его только в среде IDE. Вам нужно будет написать сборку script самостоятельно, чтобы использовать al.exe, компоновщик компоновки. Для этого нет веских причин, о которых я могу думать, все компиляторы .NET уже знают, как напрямую сгенерировать единую сборку модуля. Al.exe - типичный инструмент начальной загрузки, возможно, используемый для сборки mscorlib.dll.

Ответ 2

В .net разница между сборкой и модулем заключается в том, что модуль не содержит манифест.

//Copied from CLR via C#

Что проявляется?

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

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

Как объединить модули для формирования сборки?

Использование компилятора С#

Чтобы понять, как создать мультифиле/мультимодуль сборка, предположим, что у нас есть два файла исходного кода:

■■ RUT.cs, который содержит редко используемые типы

■■ FUT.cs, который содержит часто используемые типы

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

csc /t:module RUT.cs

Эта строка заставляет компилятор С# создавать файл RUT.netmodule. Этот файл является стандартным файлом DLL PE, но сам по себе он не может загрузить его. Затем следует скомпилировать часто используемые типы в свой собственный модуль. Хорошо сделайте этот модуль хранитель манифеста сборки, потому что типы используются так часто. Фактически, поскольку этот модуль теперь будет представлять всю сборку, Ill изменит имя выходного файла на MultiFileLibrary.dll вместо того, чтобы называть его FUT.dll.

csc /out:MultiFileLibrary.dll /t:library /addmodule:RUT.netmodule FUT.cs

В этой строке компилятор С# компилирует файл FUT.cs для создания файла MultiFileLibrary.dll. Потому как /t: библиотека, файл DLL PE, содержащий таблицы метаданных манифеста, Файл MultiFileLibrary.dll. Переключатель /addmodule:RUT.netmodule сообщает компилятору, что RUT.netmodule это файл, который следует считать частью сборки. В частности, переключатель /addmodule сообщает компилятор, чтобы добавить файл в таблицу метаданных манифеста FileDef и публично добавить RUT.netmodules экспортированные типы в таблицу метаданных экспонентов ExportedTypesDef.

После того как компилятор завершил всю свою обработку, создаются два файла, показанные на рисунке 2-1. Модуль справа содержит манифест.

enter image description here

Использование компоновщика сборки

Утилита AL.exe может создавать файл EXE или DLL PE, содержащий только манифест, описывающий типы в других модулях. Чтобы понять, как работает AL.exe, можно изменить способ использования MultiFileLibrary.dll сборка.

csc /t:module RUT.cs
csc /t:module FUT.cs
al /out: MultiFileLibrary.dll /t:library FUT.netmodule RUT.netmodule

На рисунке 2-3 показаны файлы, которые являются результатом выполнения этих операторов.

enter image description here

Я бы предложил вам прочитать ГЛАВА 2: Построение, упаковка, развертывание и администрирование приложений и типов из CLR через С# Джеффри Рихтера, чтобы понять концепцию подробно.

Ответ 3

Модуль является логической коллекцией кода в сборке. Вы можете иметь несколько модулей внутри сборки, и каждый модуль может быть написан на разных языках .NET(VS, насколько мне известно, не поддерживает создание многомодульных сборок).

Ассембли содержат модули. Модули содержат классы. Классы содержат функции.

От: Что такое модуль в .NET?

Really From: Bing search ".NET module vs assembly"