是否可以 internalize/IL-merge 单个 C# class?
Is it possible to internalize/IL-merge a single C# class?
我有一个应用程序引用了一个相当大的库 DLL(我们称之为 lib.dll
),但它只使用其中的一个 class(我们称之为 Helper
).
lib.dll
有额外的传递引用,这些引用在编译时都被复制到我的项目的 bin
文件夹中。
我非常想避免这种开销,并想办法将 "copy" 或 "cross-compile" 或 "merge" 构成 Helper
的代码添加到我的主项目中。
有没有可能这样做?我想完全避免 IL 合并 lib.dll
。
如果您使用的是 .NET Core,那么新的 .NET Linker would be an option. Otherwise, license permitting, and if the class you use does not have too many dependencies and the dll is not obfuscated, you could just copy the code to your application by decompiling the dll with IL Spy
在某些情况下,您可以将第三方 dll 作为嵌入式资源嵌入并自行解析引用,如 Jeffrey Richter 所述here。
简而言之,在您的入口点:
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);
}
};
我有一个应用程序引用了一个相当大的库 DLL(我们称之为 lib.dll
),但它只使用其中的一个 class(我们称之为 Helper
).
lib.dll
有额外的传递引用,这些引用在编译时都被复制到我的项目的 bin
文件夹中。
我非常想避免这种开销,并想办法将 "copy" 或 "cross-compile" 或 "merge" 构成 Helper
的代码添加到我的主项目中。
有没有可能这样做?我想完全避免 IL 合并 lib.dll
。
如果您使用的是 .NET Core,那么新的 .NET Linker would be an option. Otherwise, license permitting, and if the class you use does not have too many dependencies and the dll is not obfuscated, you could just copy the code to your application by decompiling the dll with IL Spy
在某些情况下,您可以将第三方 dll 作为嵌入式资源嵌入并自行解析引用,如 Jeffrey Richter 所述here。
简而言之,在您的入口点:
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);
}
};