Как обернуть сборки в .NET? - PullRequest
       2

Как обернуть сборки в .NET?

2 голосов
/ 04 августа 2011

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

В управляемом C # у меня есть dll, называемая "A", которая является плагином для другого приложения, у которого есть класс, производный от класса в другой dll, которую я назвал dll "B". Я хочу сделать dll-оболочку для «B», чтобы «A» мог работать с обернутой версией «B» и даже не использовать настоящую версию «B».

B также имеет статические методы и другие классы, я хочу иметь возможность переопределить сигнатуры / объявления в этой квазиоболочке и использовать вместо этого сборку "A".

Плагин DLL A:

using baseDllB;
public class foopluginA : pluginclassB
{
   public void methodbaz() { base.doStuff(); pluginclassB.doStaticStuff(); }
}

Base dll B:

namespace baseDllB
{
   public class pluginclassB
   {
       public void doStuff()
       {
        //Do stuff
       }
       public static void doStaticStuff() { /*Do more stuff*/ }
   }
}

Плагин dll, очевидно, ссылается на B, поэтому я хочу воссоздать B, где я могу выполнить ведение журнала и т. Д.

Какие есть способы сделать это?

Ответы [ 2 ]

2 голосов
/ 04 августа 2011

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

Вам придется заменить ссылки на исходную сборку новой сборкой-оберткой.

Вы должны отразить изменения класса в оболочке для обернутого класса.Это может быть нетривиальным, особенно если внутреннее состояние содержит закрытые члены.Если это статический класс, это намного проще.

Если вы хотите, чтобы сборка-обертка могла загружать более одного вида упакованных сборок, например, чтобы выбрать класс для пересылки, вам потребуется либонаписать интерфейс и сделать обернутые сборки производными от этого интерфейса, иначе ваш код в сборке обертки станет очень сложным.

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

1 голос
/ 04 августа 2011

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

...