Можно ли интернализировать / IL-объединить один класс C#?


У меня есть приложение со ссылкой на довольно большую библиотеку DLL (назовем ее lib.dll), но оно использует только один класс из нее (назовем это Helper).

lib.dll имеет дополнительные транзитивные ссылки, которые все копируются в папку bin моего проекта при компиляции.

Я серьезно хотел бы избежать этих накладных расходов и найти способ "скопировать" или "скомпилировать" или "объединить" код, который составляет Helper в мой основной проект.

Есть ли какие-либо возможности для этого ну и что? Я хотел бы избежать Il-слияния lib.dll во всей его полноте.

2 4

2 ответа:

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

В двух словах, в вашей точке входа:

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => {
    string name = new AssemblyName(args.Name).Name;

    // Either hardcode the appropriate namespace or retrieve it at runtime in a way that makes sense for your project.
    string resourceName = string.Concat("My.Namespace.Resources.", name, ".dll");

    using(var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) {
        var buffer = new byte[stream.Length];
        stream.Read(buffer, 0, buffer.Length);

        return Assembly.Load(buffer);
    }
};

Если бы вы использовали .NET Core, то новый.NET Linker был бы вариантом. В противном случае, если позволяет лицензия, и если класс, который вы используете, не имеет слишком много зависимостей и dll не запутана, вы можете просто скопировать код в приложение, декомпилировав dll с помощью IL Spy