最后我做到了几乎完全raboof的方式提出(以及类似dgvid建议是什么),但有一些小的变化和一些遗漏固定。我选择了这个方法,因为它是最接近于我一直在寻找在首位的,不需要使用任何第三方可执行文件和这样的。它很棒!
这是我的代码结束什么看起来像:
编辑:我决定把这个功能移动到另一个程序集,所以我可以在多个文件中重复使用它(我只是传递Assembly.GetExecutingAssembly())。
这是更新的版本,它允许您在装配通过与嵌入式dll文件。
embeddedResourcePrefix是嵌入式资源的字符串路径,它通常是程序集的名称,后跟包含资源的任何文件夹结构(例如,“MyComapny.MyProduct.MyAssembly.Resources”,如果dll位于名为项目中的资源)。它还假定该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();
}
}
发布后发现@dgvid在响应时间内击败了我。 :P – 2008-09-18 21:44:05
我非常成功地使用此代码来完成我想要的功能。查看我的帖子,了解我修复的一些次要语法遗漏(没有足够的代表编辑这个;))。 – 2008-09-19 17:14:48