问题描述
我们有我们分发对其他DLL外部依赖的DLL。而不是冒着丢失的DLL或具有潜在的混合和匹配的情况下,我们嵌入的DLL我们自己的DLL / EXE里面并加载它在运行时,以满足运行时链接。
问:的
A)
之间- 在嵌入我们的.EXE / .DLL里面的DLL,然后加载到内存在运行时和
- 在保持DLL的文件系统上的一个单独的文件,然后让系统加载我们
哪种方法会消耗更多的内存和大约多少钱?
B)有没有人有比上面的更好的办法?特别是对于在详细资料#3 的下面。
的兴趣在我们的程序的详细资料:的
-
注册为AssemblyResolve事件时,我们知道运行code在装配之前调用的部分(如:初始化时间)
公共无效SomeInit code() { ... AppDomain.CurrentDomain.AssemblyResolve + =(发件人,参数)=> { 串[] assemblyDetail = args.Name.Split(,); 变种的AssemblyName = assemblyDetail [0] +为.dll; 变种thisAssembly = Assembly.GetExecutingAssembly(); 变种allResourceNames = thisAssembly.GetManifestResourceNames(); 串requiredResName = allResourceNames.SingleOrDefault(一个=> a.EndsWith(的AssemblyName)); 使用(VAR输入= thisAssembly.GetManifestResourceStream(requiredResName)) { 返回输入!= NULL ?的Assembly.Load(StreamToBytes(输入)) : 空值; } }; ... } 静态的byte [] StreamToBytes(流输入) { 无功容量= input.CanSeek? (int)的input.Length:0; 使用(VAR输出=新的MemoryStream(容量)) { INT读数长度; VAR缓冲区=新的字节[4096]; 做 { 读数长度= input.Read(缓冲液,0,buffer.Length); output.Write(缓冲液,0,读数长度); } 而(读数长度!= 0); 返回output.ToArray(); } }
-
嵌入汇编。这是通过添加现有项目,以.NET项目=>挑.DLL =>确定。回去挑.dll和在性质改变建设行动,以嵌入的资源。
-
我们还必须添加相同的.DLL作为参考,还需要有
使用ExternalNamespace;对类使用它的顶部
语句。如果没有,构建过程失败,因为它无法看到外部DLL code在编译时。因此,作为一个生成后的行动,我们必须从最后的斌删除.dll文件(而不是它的嵌入式克隆)
文件夹。
答:只要将内部组件本身不具备一定规模庞大(一些大规模的嵌入式资源,例如)应该工作的可接受的 - 这是一个有点wriggly的答案,但我没有一个更好的除衡量。我(以及类似的原因)做得非常类似的事情偶尔为之。
B:将复制本地上的参考属性() to False
. You would need the using ExternalNamespace;
even if the files were in the same project - that just brings the namespace into play.
这篇关于内存和CPU影响时,一个DLL被嵌入一个.NET的DLL / EXE里面?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!