Практическое руководство. Создание многофайловой сборки
Примечание.
Эта статья относится к .NET Framework. Он не применяется к более новым реализациям .NET, включая .NET 6 и более поздние версии.
В этой статье рассматривается порядок создания многофайловой сборки и приводится код, иллюстрирующий каждый шаг процедуры.
Примечание.
Интегрированную среду разработки в Visual Studio для C# и Visual Basic можно использовать только для создания однофайловых сборок. Если требуется создать многофайловую сборку, необходимо использовать компиляторы командной строки или Visual Studio с Visual C++. Многофайловые сборки поддерживаются только .NET Framework.
Создание многофайловой сборки
Скомпилируйте в модули кода все файлы, содержащие пространства имен, на которые имеются ссылки в других модулях сборки. По умолчанию для модулей кода используется расширение NETMODULE.
Предположим, например, что файл
Stringer
имеет пространство именmyStringer
, которое содержит класс с именемStringer
. КлассStringer
содержит метод с именемStringerMethod
, который выводит отдельную строку на консоль.// Assembly building example in the .NET Framework. using namespace System; namespace myStringer { public ref class Stringer { public: void StringerMethod() { System::Console::WriteLine("This is a line from StringerMethod."); } }; }
// Assembly building example in the .NET Framework. using System; namespace myStringer { public class Stringer { public void StringerMethod() { System.Console.WriteLine("This is a line from StringerMethod."); } } }
' Assembly building example in the .NET Framework. Namespace myStringer Public Class Stringer Public Sub StringerMethod() System.Console.WriteLine("This is a line from StringerMethod.") End Sub End Class End Namespace
Для компиляции этого кода используйте следующую команду:
cl /clr:pure /LN Stringer.cpp
csc /t:module Stringer.cs
vbc /t:module Stringer.vb
Задание параметра module вместе с параметром компилятора /t: указывает на то, что результатом компиляции является модуль, а не сборка. Компилятор создает модуль с именем Stringer.netmodule, который можно добавить в сборку.
Скомпилируйте все другие модули, используя соответствующие параметры компилятора для указания других модулей, на которые имеются ссылки в коде. На этом этапе используется параметр компилятора /addmodule.
В следующем примере модуль кода с именем Client имеет метод точки
Main
входа, который ссылается на метод в модуле Stringer.netmodule , созданном на шаге 1.#using "Stringer.netmodule" using namespace System; using namespace myStringer; //The namespace created in Stringer.netmodule. ref class MainClientApp { // Static method Main is the entry point method. public: static void Main() { Stringer^ myStringInstance = gcnew Stringer(); Console::WriteLine("Client code executes"); myStringInstance->StringerMethod(); } }; int main() { MainClientApp::Main(); }
using System; using myStringer; class MainClientApp { // Static method Main is the entry point method. public static void Main() { Stringer myStringInstance = new Stringer(); Console.WriteLine("Client code executes"); myStringInstance.StringerMethod(); } }
Imports myStringer Class MainClientApp ' Static method Main is the entry point method. Public Shared Sub Main() Dim myStringInstance As New Stringer() Console.WriteLine("Client code executes") myStringInstance.StringerMethod() End Sub End Class
Для компиляции этого кода используйте следующую команду:
cl /clr:pure /FUStringer.netmodule /LN Client.cpp
csc /addmodule:Stringer.netmodule /t:module Client.cs
vbc /addmodule:Stringer.netmodule /t:module Client.vb
Укажите параметр /t:module, поскольку этот модуль будет добавлен в сборку на следующем шаге. Также укажите параметр /addmodule, так как код в Client ссылается на пространство имен, созданное кодом в Stringer.netmodule. Компилятор создает модуль с именем Client.netmodule, который содержит ссылку на другой модуль — Stringer.netmodule.
Примечание.
Компиляторы C# и Visual Basic поддерживают непосредственное создание многофайловых сборок с помощью следующих двух синтаксических структур.
Для создания сборки из двух файлов используются две компиляции:
cl /clr:pure /LN Stringer.cpp cl /clr:pure Client.cpp /link /ASSEMBLYMODULE:Stringer.netmodule
csc /t:module Stringer.cs csc Client.cs /addmodule:Stringer.netmodule
vbc /t:module Stringer.vb vbc Client.vb /addmodule:Stringer.netmodule
При создании сборки из двух файлов используется одна компиляция:
cl /clr:pure /LN Stringer.cpp cl /clr:pure Client.cpp /link /ASSEMBLYMODULE:Stringer.netmodule
csc /out:Client.exe Client.cs /out:Stringer.netmodule Stringer.cs
vbc /out:Client.exe Client.vb /out:Stringer.netmodule Stringer.vb
Используйте компоновщик сборок (Al.exe) для создания выходного файла, содержащего манифест сборки. Выходной файл содержит справочную информацию для всех модулей или ресурсов, входящих в сборку.
В командной строке введите следующую команду:
имя> модуля al><<... /main:<имя метода>/out:<имя файла>/target:<тип файла сборки>
В этой команде в аргументах имя модуля задаются имена всех модулей, которые будут включены в сборку. В параметре /main: указывается имя метода, являющегося точкой входа сборки. В параметре /out: задается имя выходного файла, содержащего метаданные сборки. В параметре /target: указывается, что сборка является исполняемым файлом консольного приложения (EXE), исполняемым файлом Windows (WIN) или же файлом библиотеки (LIB).
В следующем примере средство Al.exe создает сборку, являющуюся исполняемым файлом консольного приложения с именем myAssembly.exe. Приложение состоит из двух модулей с именами Client.netmodule и Stringer.netmodule, а также исполняемого файла myAssembly.exe, который содержит только метаданные сборки. Точкой входа сборки является метод
Main
классаMainClientApp
, который находится в Client.dll.al Client.netmodule Stringer.netmodule /main:MainClientApp.Main /out:myAssembly.exe /target:exe
Вы можете использовать disassembler IL (Ildasm.exe) для проверки содержимого сборки или определения того, является ли файл сборкой или модулем.