Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当DLL嵌入.NET DLL/EXE中时,会对内存和CPU产生影响吗?_.net_Performance_Dll - Fatal编程技术网

当DLL嵌入.NET DLL/EXE中时,会对内存和CPU产生影响吗?

当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,它对其他DLL具有外部依赖性。我们将DLL嵌入到自己的DLL/EXE中,并在运行时加载,以满足运行时链接的要求,而不是冒丢失DLL或可能出现混合和匹配情况的风险

问题:

A) 中间

  • 将DLL嵌入到.EXE/.DLL中,然后在运行时将其加载到内存中 及
  • 将DLL作为单独的文件保存在文件系统中,然后让系统为我们加载它
哪种方法消耗的内存更多,大约消耗多少

B) 有人有比以上更好的方法吗?特别是以下详细信息中的第#3项


有关我们对感兴趣的客户的流程的详细信息:

  • 在调用程序集中的代码之前已知运行的部分注册AssemblyResolve事件(例如:init time)

  • 嵌入程序集。这是通过将“添加现有项”添加到.NET项目=>选择.dll=>ok来完成的。返回并选择.dll,在属性中将“构建操作”更改为“嵌入式资源”

  • 我们仍然需要添加相同的.DLL作为引用,并且仍然需要使用ExternalNamespace使用
    语句。否则,构建过程将失败,因为它在编译时看不到外部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();
        }
    }