当DLL嵌入.NET DLL/EXE中时,会对内存和CPU产生影响吗?
我们分发了一个DLL,它对其他DLL具有外部依赖性。我们将DLL嵌入到自己的DLL/EXE中,并在运行时加载,以满足运行时链接的要求,而不是冒丢失DLL或可能出现混合和匹配情况的风险 问题: A) 中间当DLL嵌入.NET DLL/EXE中时,会对内存和CPU产生影响吗?,.net,performance,dll,.net,Performance,Dll,我们分发了一个DLL,它对其他DLL具有外部依赖性。我们将DLL嵌入到自己的DLL/EXE中,并在运行时加载,以满足运行时链接的要求,而不是冒丢失DLL或可能出现混合和匹配情况的风险 问题: A) 中间 将DLL嵌入到.EXE/.DLL中,然后在运行时将其加载到内存中 及 将DLL作为单独的文件保存在文件系统中,然后让系统为我们加载它 哪种方法消耗的内存更多,大约消耗多少 B) 有人有比以上更好的方法吗?特别是以下详细信息中的第#3项 有关我们对感兴趣的客户的流程的详细信息: 在调用程序集
- 将DLL嵌入到.EXE/.DLL中,然后在运行时将其加载到内存中 及
- 将DLL作为单独的文件保存在文件系统中,然后让系统为我们加载它
有关我们对感兴趣的客户的流程的详细信息:
使用它的类顶部的代码>语句。否则,构建过程将失败,因为它在编译时看不到外部DLL代码。因此,作为构建后操作,我们必须从最终的bin
文件夹中删除.DLL文件(不是嵌入的克隆)
答:只要内部组件本身没有太大的尺寸(例如,一些巨大的嵌入式资源),它应该可以正常工作——这是一个有点扭曲的答案,但除了“测量它”,我没有更好的答案。我偶尔也做过类似的事情(出于类似的原因) B:将参考属性(f4)上的“复制本地”设置为
False
。您需要使用ExternalNamespace代码>即使文件在同一个项目中-这只是发挥了名称空间的作用。正如Marc所建议的那样
我会用ILMerge把所有的东西放在一起
但是,这可能是不可能的,但应该适用于“纯”托管程序集(包括使用不安全的程序集)。匿名关闭
投票者:至少要大声说出来。你无法让安装程序处理依赖项?不过,这是一个好的观点,这是一个针对developer的独立的无安装发行版,我会将所有内容合并在一起:)@leppie您应该添加这一点作为答案-这可能是一个理想的解决方案
public void SomeInitCode()
{
...
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
string[] assemblyDetail = args.Name.Split(',');
var assemblyName= assemblyDetail[0] + ".dll";
var thisAssembly = Assembly.GetExecutingAssembly();
var allResourceNames = thisAssembly.GetManifestResourceNames();
string requiredResName = allResourceNames.SingleOrDefault(a => a.EndsWith(assemblyName));
using (var input = thisAssembly.GetManifestResourceStream(requiredResName))
{
return input != null
? Assembly.Load(StreamToBytes(input))
: null;
}
};
...
}
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();
}
}