将一个dll作为嵌入式资源嵌入到另一个dll中,然后从我的代码中调用它
我遇到的情况是,我正在创建一个使用另一个第三方DLL的DLL,但我希望能够将第三方DLL构建到我的DLL中,而不是尽可能将它们保持在一起。
这是C#和.NET 3.5。
我要这样做的方式是将第三方DLL存储为嵌入式资源,然后在执行第一个DLL时将其放置在适当的位置。
我最初计划执行此操作的方法是编写代码以将第三方DLL放在System.Reflection.Assembly.GetExecutingAssembly().Location.ToString()
减去最后一个指定的位置/nameOfMyAssembly.dll
。我可以.DLL
在该位置成功保存第三方(最终被保存为
C:\ Documents and Settings \ myUserName \ Local Settings \ Application Data
\ assembly \ dl3 \ KXPPAX6Y.ZCY \ A1MZ1499.1TR \ e0115d44 \
91bb86eb_fe18c901
),但是当我到达需要此DLL的代码部分时,找不到它。
有人对我需要做些不同的事情有任何想法吗?
回答:
将第三方程序集作为资源嵌入后,AppDomain.AssemblyResolve
在应用程序启动期间添加代码以订阅当前域的事件。只要CLR的Fusion子系统未能根据有效的探测(策略)找到程序集,就会触发此事件。在的事件处理程序中AppDomain.AssemblyResolve
,使用加载资源,Assembly.GetManifestResourceStream
并将其内容作为字节数组送入相应的Assembly.Load
重载。以下是一种这样的实现在C#中的样子:
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>{
var resName = args.Name + ".dll";
var thisAssembly = Assembly.GetExecutingAssembly();
using (var input = thisAssembly.GetManifestResourceStream(resName))
{
return input != null
? Assembly.Load(StreamToBytes(input))
: null;
}
};
在那里StreamToBytes
可以定义为:
static byte[] StreamToBytes(Stream input) {
var capacity = input.CanSeek ? (int) input.Length : 0;
using (var output = new MemoryStream(capacity))
{
int readLength;
var buffer = new byte[4096];
do
{
readLength = input.Read(buffer, 0, buffer.Length);
output.Write(buffer, 0, readLength);
}
while (readLength != 0);
return output.ToArray();
}
}
最后,正如一些人已经提到的那样,ILMerge可能是另一个可以考虑的选择,尽管它涉及更多。
以上是 将一个dll作为嵌入式资源嵌入到另一个dll中,然后从我的代码中调用它 的全部内容, 来源链接: utcz.com/qa/431742.html