Практическое руководство. Создание многофайловой сборки

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

Создание многофайловой сборки

  1. Скомпилируйте в модули кода все файлы, содержащие пространства имен, на которые имеются ссылки в других модулях сборки. По умолчанию расширение для модулей кода: NETMODULE. Например, если файл с именем Stringer создает пространство имен с именем myStringer, на которое ссылается код файла Client, то Stringer должен быть скомпилирован в модуль кода первым.

  2. Скомпилируйте все другие модули, используя соответствующие параметры компилятора для указания других модулей, на которые имеются ссылки в коде.

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

    ПримечаниеПримечание

    Интегрированную среду разработки в Visual Studio 2005 для C# и Visual Basic можно использовать только для создания однофайловых сборок.Если нужно создать многофайловую сборку, то необходимо использовать компилятор командной строки или Visual Studio 2005 с Visual C++.

В следующем примере показан первый шаг вышеописанной процедуры, в котором производится компиляция файлов с пространствами имен, на которые имеются ссылки из других файлов. Этот пример начинается с простого кода для файла Stringer. В Stringer имеется пространство имен myStringer, содержащее класс Stringer. Класс Stringer содержит метод с именем StringerMethod, который выводит отдельную строку на консоль.

' Assembly building example in the .NET Framework.
Imports System

Namespace myStringer
    Public Class Stringer
        Public Sub StringerMethod()
            System.Console.WriteLine("This is a line from StringerMethod.")
        End Sub
    End Class
End Namespace
// 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.
using namespace System;

namespace myStringer
{
    public ref class Stringer
    {
    public:
        void StringerMethod()
        {
            System::Console::WriteLine("This is a line from StringerMethod.");
        }
    };
}

Для компиляции этого кода используйте следующую команду:

vbc /t:module Stringer.vb
csc /t:module Stringer.cs
cl /clr:pure /LN Stringer.cpp

Задание параметра module вместе с параметром компилятора /t: указывает на то, что результатом компиляции является модуль, а не сборка. Компилятор создает модуль с именем Stringer.netmodule, который можно добавить в сборку.

На втором шаге процедуры необходимо скомпилировать модули, содержащие ссылки на другие модули. На этом этапе используется параметр компилятора /addmodule. В следующем примере модуль кода с именем Client имеет метод точки входа Main, который ссылается на метод в модуле Stringer.dll, созданном на первом шаге.

В следующем примере показан код модуля Client.

Imports System
Imports myStringer 'The namespace created in Stringer.netmodule.

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
using System;
using myStringer; //The namespace created in Stringer.netmodule.

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();
    }
}
#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();
}

Для компиляции этого кода используйте следующую команду:

vbc /addmodule:Stringer.netmodule /t:module Client.vb
csc /addmodule:Stringer.netmodule /t:module Client.cs
cl /clr:pure /FUStringer.netmodule /LN Client.cpp

Укажите параметр /t:module, поскольку этот модуль будет добавлен в сборку на следующем шаге. Также укажите параметр /addmodule, поскольку код в Client ссылается на пространство имен, созданное кодом в Stringer.netmodule. Компилятор создает модуль с именем Client.netmodule, который содержит ссылку на модуль Stringer.netmodule.

ПримечаниеПримечание

Компиляторы C# и Visual Basic поддерживают непосредственное создание многофайловых сборок с помощью следующих двух синтаксических структур.

  • Для создания сборки из двух файлов используются две компиляции:
vbc /t:module Stringer.vb
vbc Client.vb /addmodule:Stringer.netmodule
csc /t:module Stringer.cs
csc Client.cs /addmodule:Stringer.netmodule
cl /clr:pure /LN Stringer.cpp
cl /clr:pure Client.cpp /link /ASSEMBLYMODULE:Stringer.netmodule
  • При создании сборки из двух файлов используется одна компиляция:
vbc /out:Client.exe Client.vb /out:Stringer.netmodule Stringer.vb
csc /out:Client.exe Client.cs /out:Stringer.netmodule Stringer.cs
cl /clr:pure /LN Stringer.cpp
cl /clr:pure Client.cpp /link /ASSEMBLYMODULE:Stringer.netmodule

Для создания сборки из коллекции модулей скомпилированного кода можно использовать компоновщик сборок (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 

Для проверки содержимого сборки или определения, является ли файл сборкой или модулем, можно использовать средство MSIL Disassembler (Ildasm.exe).

См. также

Задачи

Практическое руководство. Просмотр содержимого сборок

Основные понятия

Создание сборок

Обнаружение сборок в среде выполнения

Многофайловые сборки