Создание много модульных сборок. Часть 2

добавлено: 10 апр 14
понравилось:0
просмотров: 940
комментов: 0

теги:

Автор: gpu

В предыдущей части ([url=]http://www.sql.ru/blogs/gpu_blog/1804[/url]) рассматривалось решение с доступом к исходникам.
Данная запись рассматривает решение без доступа к исходникам


Решение 2 (Наличие сборок)
Возникла необходимость создание .NET Assembly состоящей из нескольких модулей.
Используемые инструменты:

Компилятор (vbc.exe) и Ассемблер (ilasm.exe) находяться в
C:\Windows\Microsoft.NET\Framework\v4.0.30319
Линкер (al.exe) и дизассемблер (ildasm.exe) находяться в>
"C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools"

Исходные данные
Сборка Assembly1.dll, содержащая один класс Class1.
Сборка Assembly2.dll, содержащая один класс Class2.

Конечное приложение> App.vbproj
Imports Assembly1
Imports Assembly2
Class Application
    Public Sub New()
        Dim c1 As New Class1()
        c1.method()
        Dim c2 As New Class2()
        c2.method()
    End Sub
End Class

Конечное приложение имeет ссылки на Assembly1.dll и Assembly2.dll

Необходимо заменить ссылки на Assembly1.dll и Assembly2.dll на единственную ссылку, назовем ее AssemblyGate.dll
без изменения исходного кода ( Imports Assembly1)


1. Получаем IL Код
ildasm.exe Assembly1.dll /output:References\Assembly1.dll.il
ildasm.exe Assembly2.dll /output:References\Assembly2.dll.il

Cодержимое Assembly1.dll.il будет выглядеть как то так
+ IL Код

.assembly Assembly1
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )

// --- The following custom attribute is added automatically, do not uncomment -------
// .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 07 01 00 00 00 00 )

.custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx
63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows.
.custom instance void [mscorlib]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = ( 01 00 1A 2E 4E 45 54 46 72 61 6D 65 77 6F 72 6B // ....NETFramework
2C 56 65 72 73 69 6F 6E 3D 76 34 2E 30 01 00 54 // ,Version=v4.0..T
0E 14 46 72 61 6D 65 77 6F 72 6B 44 69 73 70 6C // ..FrameworkDispl
61 79 4E 61 6D 65 10 2E 4E 45 54 20 46 72 61 6D // ayName..NET Fram
65 77 6F 72 6B 20 34 ) // ework 4
.hash algorithm 0x00008004
.ver 0:0:0:0
}
.module Assembly1.dll
// MVID: {78BF4A04-E722-4E9D-BEE6-C00A5F2D8D4E}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0002 // WINDOWS_GUI
.corflags 0x00000001 // ILONLY
// Image base: 0x00660000


// =============== CLASS MEMBERS DECLARATION ===================
.class public auto ansi Assembly1.Class1
extends [mscorlib]System.Object
{
} // end of class Assembly1.Class1

// =============================================================

// *********** DISASSEMBLY COMPLETE ***********************


2. Редактирование IL кода
Удаляем секцию .assembly из IL кода и сохраняем изменения

3. Пересобираем Assembly1.dll и Assembly2.dll
ilasm.exe /output:References\Assembly1.dll /dll References\Assembly1.dll.il
ilasm.exe /output:References\Assembly2.dll /dll References\Assembly2.dll.il

4. Создаем Сборку
al.exe" /target:lib /out:References\AssemblyGate.dll References\Assembly1.dll References\Assembly2.dll

В директории References будут находиться 3 файла
Assembly1.dll (бинарный модуль 1)
Assembly2.dll (бинарный модуль 2)
AssemblyGate.dll (многомодульная сборка)

5. Изменяем конечное приложение
Удаляем проектные ссылки на сборки Assembly1 и Assembly2 и добавляем ссылку на AssemblyGate.dll
Компилируем проект.
Файлы Assembly1.dll, Assembly2.dll и AssemblyGate.dll будит скопированы в исполняемую директорию проекта.
Запускаем приложение и убеждаемся что все работает.

Комментарии




Необходимо войти на сайт, чтобы оставлять комментарии