Создайте оболочку .net dll вокруг существующей библиотеки .net - PullRequest
3 голосов
/ 29 марта 2012

У меня есть dll с именем ExорогоAndLargeObfuscatedFoo.dll.Допустим, он определяет тип с именем ExорогоAndLargeObfuscatedFooSubClass.Он был скомпилирован для .NET.

Существуют ли какие-либо инструменты (бесплатные, платные и т. Д.), Которые будут генерировать файлы классов c # или vb, которые ничего не будут делать, кроме обтекания всего , определенного в этой дорогой dll?Таким образом я могу добавить функциональность, исправить ошибки (которые CorpFUBAR не исправит), добавить ведение журнала и т. Д.?

Буквально, я хочу вывод, который выглядит следующим образом

namespace easytoread {
    public class SubClass {
        private ExpensiveAndLargeObfuscatedFoo.SubClass _originalSubClass;
        public SubClass() {
            this._originalSubClass = new ExpensiveAndLargeObfuscatedFoo.SubClass ();
        }
        public string StupidBuggyMethod(string param1,int param2) {
            return _originalSubClass.StupidBuggyMethod(param1, param2);
        }
    }
}

Он должен обрабатывать пользовательские типы возврата, а также примитивы

namespace easytoread {
    public class SubFooClass {
        private ExpensiveAndLargeObfuscatedFoo.SubFooClass _originalSubFooClass;
        public SubFooClass() {
            this._originalSubFooClass= new ExpensiveAndLargeObfuscatedFoo.SubFooClass ();
        }
        private SubFooClass(ExpensiveAndLargeObfuscatedFoo.SubFooClass orig) {
            this._originalSubFooClass = orig;
        }
        public SubFooClass StupidBuggyMethod(string param1,int param2) {
            return new SubFooClass(_originalSubFooClass.StupidBuggyMethod(param1, param2));
        }
    }
}

И так далее, и так далеевперед для каждого определенного класса.

По сути, бедный человек динамический прокси?(да, Castle Project потрясающий!)

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

Без переименования мы 'я смог бы заменить старую сборку на новую сгенерированную, изменить с помощью операторов и продолжить, как будто ничего не произошло (за исключением ошибок, исправленных!)

Нужно просто проверить dll и выполнить генерацию кода.сгенерированный код может быть даже VB.NET, ironpython или чем-то вроде CLR.

Это скользкий уклон, и я не рад, что оказался здесь, но, похоже, это путь.Я посмотрел на проект Castle, но если я не ошибаюсь, это не сработает по двум причинам: 1) я не могу ничего переименовать (не спрашивать), 2) ни один из методов сборок не объявлен виртуальным или даже перезаписываемым,Даже если бы они были, есть сотни типов, которые мне пришлось бы переопределить вручную, что не очень весело.

Ответы [ 3 ]

3 голосов
/ 29 марта 2012

ReSharper может сделать большую часть работы за вас.

Вам нужно будет объявить базовый класс:

namespace easytoread {
    public class SubClass {
        private ExpensiveAndLargeObfuscatedFoo.SubClass _originalSubClass;
    }
}

Затем выберите ReSharper> Редактировать>Сгенерируйте код (Alt + Ins), выберите «Делегирование членов», выберите все и дайте ему сгенерировать код.

Он не будет переносить возвращаемые значения с помощью пользовательских классов (он будет возвращать исходный тип), поэтомуэто все равно придется добавить вручную.

1 голос
/ 30 марта 2012

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

ОБНОВЛЕНИЕ Visual Studio 2012 Подделки кажутся многообещающими.http://msdn.microsoft.com/en-us/library/tfs/hh549175(v=vs.110).aspx - мы пошли дальше, но я мог бы попытаться создать фальшивку, а затем добавить ее в качестве замены DLL в будущем

1 голос
/ 29 марта 2012
  1. Если у вас есть доступ к исходному коду, переименуйте и исправьте в исходном коде код.
  2. Если у вас нет доступа (и вы можете сделать это легально), используйте некоторые инструмент, такой как Reflector или dotPeek , чтобы получить исходный код, а затем, перейти к первому пункту.
...