Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Замечание
Эта статья связана с .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.cppcsc /t:module Stringer.csvbc /t:module Stringer.vbУказание параметра модуля с
/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.cppcsc /addmodule:Stringer.netmodule /t:module Client.csvbc /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.netmodulecsc /t:module Stringer.cs csc Client.cs /addmodule:Stringer.netmodulevbc /t:module Stringer.vb vbc Client.vb /addmodule:Stringer.netmoduleОдна компиляция создает двухфайловую сборку:
cl /clr:pure /LN Stringer.cpp cl /clr:pure Client.cpp /link /ASSEMBLYMODULE:Stringer.netmodulecsc /out:Client.exe Client.cs /out:Stringer.netmodule Stringer.csvbc /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Вы можете использовать il Disassembler (Ildasm.exe) для проверки содержимого сборки или определения того, является ли файл сборкой или модулем.