【问题标题】:How to not load unused assembly如何不加载未使用的程序集
【发布时间】:2016-10-17 19:43:43
【问题描述】:

在 ASP.NET MVC4 应用程序中加载 System.Data.OracleClient 程序集。

控制器中的代码

   var sb = new StringBuilder();
   foreach (Assembly b in AppDomain.CurrentDomain.GetAssemblies())
        sb.AppendLine(b.FullName);

输出它:

 System.Data.OracleClient, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

根据How to avoid loading unnessecary assemblies 的回答,这是由于 machine.config 中存在 Oracle 部分引起的:

<section name="system.data.oracleclient" type="System.Data.Common.DbProviderConfigurationHandler, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>

尝试在应用程序 web.config 中使用 remove 元素删除时显示错误

在运行应用程序System.Data.OracleClient 后仍会出现在已加载程序集的列表中。 解决方案不包含对任何 Oracle 命名空间的任何直接引用。 如何从加载的程序集中删除这个和其他未使用的程序集。

应用程序在内存有限的 VPS 中运行,希望这可以释放一些内存。

【问题讨论】:

  • 你有没有使用 ctrl-F 搜索“使用 System.Data.OracleClient;”的解决方案OracleClient 是 System.Data 的一部分,因此如果您引用它,OracleClient 命名空间将可用。
  • 搜索词 oracle 的解决方案没有找到参考。 using System.Data 命令存在,但它不应导致 Oracle 程序集加载
  • @Andrus 一个问题,除了那里的那条消息,该网站是否运行?
  • 在 Visual Studio 和 VPS 生产服务器的 Mono 下按 F5,应用程序运行正常。运行时忽略 web.config 错误
  • @Andrus 在我的情况下,该站点已运行,此消息是因为我不知道 - 但该站点已运行,此删除正在工作(尝试删除其他内容,您可以)...所以可能其他一些 dll 加载了 oracle 的那部分。

标签: c# asp.net .net asp.net-mvc .net-assembly


【解决方案1】:

经过进一步调查,我发现System.Data 调用并使用了这个system.data.oracleclient,如果您使用任何类型的数据库,这都是至关重要的。

在使用ILSpy 进行更多调查后,我还发现mscorlib(核心库)也引用了那个Oracle 客户端......所以你可能根本无法避免它......

因此,您需要删除此 System.Data 以避免使用 oracle 客户端 - 但如果您有任何类型的数据,它将无法播放。

从程序集中删除它,因为我在这里也有帖子 https://stackoverflow.com/a/40085122/159270

<compilation>
    <assemblies>
        <clear/>                
        <add assembly="Microsoft.VisualStudio.Web.PageInspector.Loader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        <add assembly="mscorlib" />
        <add assembly="Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        <add assembly="System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        <add assembly="System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        <add assembly="System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        <!-- 
        <add assembly="System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        -->
        <add assembly="System.Web.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        <add assembly="System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        <add assembly="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        <add assembly="System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        <add assembly="System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        <add assembly="System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        <add assembly="System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        <add assembly="System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add assembly="System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add assembly="System.Activities, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add assembly="System.ServiceModel.Activities, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add assembly="System.WorkflowServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add assembly="System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        <add assembly="System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add assembly="System.Data.DataSetExtensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        <add assembly="System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        <add assembly="System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add assembly="System.Web.DynamicData, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add assembly="System.Web.ApplicationServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add assembly="*" />
        <add assembly="System.Web.WebPages.Deployment, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    </assemblies>           
</compilation>

现在您在 Visual Studio 上看到的消息如果出现错误警报,因为 Visual Studio 无法将 web.config 编译为 IIS...实际上删除工作正常并且站点正在运行。

最后我想说的是,我不确定你能从那个 oracle 客户端删除中获得多少,因为这只是检查 web.config 中是否有任何数据库连接,如果不存在实际上什么都不做.

最重要的是最小化请求的管道,因为我在之前的答案中输入...

【讨论】:

  • 应用程序使用 Npgsql 数据提供程序、dBLinq、WebMatrix、自定义数据读取器、RDLEngine。所以System.Data 不能删除。所以看起来加载 Oracle 是无法避免的?
  • @Andrus 是的,你可能无法避免它......现在我再次扫描,发现mscorlib 也调用它 - 这是非常基本的模块!
  • @Andrus 限制管道 - 每个请求都会调用它。仅在开始时才调用此预言机(如果调用)。在我的预览答案中&lt;httpModules&gt; 的管道。这就是我所做的。
  • GetReferencedAssemblies() 不返回 mscorlib 的任何引用程序集。如何确定mscorlib 调用它?也许切换到 ASP.NET Core 会有所帮助。
  • @Andrus 我使用 ILSpy 并找到它 - 如果你看到这个 mscorlib 首先加载到程序集上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多