Поделиться через


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

Замечание

Эта статья связана с .NET Framework. Он не применяется к более новым реализациям .NET, включая .NET 6 и более поздние версии.

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

Замечание

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

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

  1. Компилировать все файлы, содержащие пространства имен, на которые ссылаются другие модули сборки, в кодовые модули. Расширение по умолчанию для модулей кода — .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
    
  2. Чтобы скомпилировать этот код, используйте следующую команду:

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

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

  3. Скомпилируйте все остальные модули, используя необходимые параметры компилятора, чтобы указать другие модули, на которые ссылается код. На этом шаге используется параметр компилятора /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
    
  4. Чтобы скомпилировать этот код, используйте следующую команду:

    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 Укажите параметр, так как код в клиенте ссылается на пространство имен, созданное кодом в 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
    
  5. Используйте Компоновщик сборок (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
    

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

См. также