Скопируйте код сборки между 2 или более DLL - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть ByteCode в сборке.Я хочу скопировать этот код в другую сборку.Это было нелегко, но на первый взгляд я получаю хороший экземпляр.Я могу скопировать пространства имен, классы, пользовательские атрибуты, поля и так далее.Но у меня есть проблема с методом Bodys.

Я знаю, что могу получить код с помощью:

byte[] ilCode = method.GetMethodBody().GetILAsByteArray();

Кроме того, я знаю, как установить новый метод Body:

MethodBuilder methodBuilder = typeBuilder.DefineMethod(method.Name, method.Attributes, method.CallingConvention, method.ReturnType, param.ToArray());
methodBuilder.SetMethodBody(ilCode, method.GetMethodBody().MaxStackSize, sig.GetSignature(), exce, null);

Переменные определены следующим образом:

  • method: MethodInfo // оригинальный метод
  • param: List // Список типов параметров
  • exec: List // Список всех исключений
  • sig: SignatureHelper // не совсем уверен, но что-то с местными жителями

Теперь у меня есть следующий результат:

Сначала оригинальный метод:

 .method private hidebysig instance void  onTargetFloorReached() cil managed
{
  // Code size       12 (0xc)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  ldstr      "TargetFloorReached"
  IL_0006:  call       instance void ['Assembly-CSharp']BaseWeb::CallFunctionWithParameter(string)
  IL_000b:  ret
} // end of method Lift::onTargetFloorReached

А теперь, что я получаю с другой стороны:

.method private hidebysig instance void  onTargetFloorReached() cil managed
{
  // Code size       12 (0xc)
  .maxstack  8
  IL_0000:  ldarg.0
INVALID TOKEN: 0x70000001
  IL_0006:  call        [ERROR: INVALID TOKEN 0x0A00000D] 
  IL_000b:  ret
} // end of method Lift::onTargetFloorReached

Я попытался загрузить каждую зависимость оригинальной библиотеки DLL, но это ничего не изменит.

Метод SetMethodBody определен как:

public void SetMethodBody (byte[] il, int maxStack, byte[] localSignature, System.Collections.Generic.IEnumerable<System.Reflection.Emit.ExceptionHandler> exceptionHandlers, System.Collections.Generic.IEnumerable<int> tokenFixups);

Нет информации о «tokenFixups».

Что это за исправления?Как я могу получить их?Или ошибка может быть где-то еще?

Редактировать: Кажется, что только вызовы функций недопустимы.Если бы я мог определить функцию по ее байтному представлению, я мог бы это исправить.

1 Ответ

0 голосов
/ 22 февраля 2019

Вы должны использовать существующие инструменты, такие как https://github.com/dotnet/ILMerge или https://github.com/gluck/il-repack, которые позволяют комбинировать dll и exe в один файл.

Как и для загрузки одного и того же класса дважды, еслисборка уже загружена в домен приложения, она не будет загружена дважды, даже если версия сборки как-то отличается (я полагаю).Так что я не вижу, как это проблема.

Смотрите для загрузки дубликатов сборок: https://social.msdn.microsoft.com/Forums/vstudio/en-US/9748a274-0925-48a1-8dc7-3214ffe55ff9/prevent-duplicate-dll-from-loading-twice-ccli?forum=netfxbcl

...