最后,我几乎完全按照 raboof 建议的方式进行了操作(并且类似于 dgvid 的建议),除了一些小的改动和一些遗漏修复。我选择这种方法是因为它最接近我最初寻找的方法,并且不需要使用任何第三方可执行文件等。效果很好!
这就是我的代码最终的样子:
编辑:我决定将此函数移动到另一个程序集,以便我可以在多个文件中重用它(我只是传入 Assembly.GetExecutingAssembly())。
这是允许您通过嵌入式 dll 传递程序集的更新版本。
EmbeddedResourcePrefix 是嵌入资源的字符串路径,它通常是程序集的名称,后跟包含资源的任何文件夹结构(例如,如果 dll 位于项目中名为 Resources 的文件夹中,则为“MyComapny.MyProduct.MyAssembly.Resources” )。它还假定 dll 具有 .dll.resource 扩展名。
public static void EnableDynamicLoadingForDlls(Assembly assemblyToLoadFrom, string embeddedResourcePrefix) {
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { // had to add =>
try {
string resName = embeddedResourcePrefix + "." + args.Name.Split(',')[0] + ".dll.resource";
using (Stream input = assemblyToLoadFrom.GetManifestResourceStream(resName)) {
return input != null
? Assembly.Load(StreamToBytes(input))
: null;
}
} catch (Exception ex) {
_log.Error("Error dynamically loading dll: " + args.Name, ex);
return null;
}
}; // Had to add colon
}
private static byte[] StreamToBytes(Stream input) {
int capacity = input.CanSeek ? (int)input.Length : 0;
using (MemoryStream output = new MemoryStream(capacity)) {
int readLength;
byte[] buffer = new byte[4096];
do {
readLength = input.Read(buffer, 0, buffer.Length); // had to change to buffer.Length
output.Write(buffer, 0, readLength);
}
while (readLength != 0);
return output.ToArray();
}
}