如何加载未使用的程序集

时间:2016-10-17 19:43:43

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

在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元素删除显示错误

enter image description here

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

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

1 个答案:

答案 0 :(得分:2)

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

在使用mscorlib进行更多调查之后,我还发现<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> (核心库)也引用了该Oracle客户端...所以可能你根本无法避免它。 ..

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

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

        decimal num = 2.5M;
        var result = Math.Round(num,0, MidpointRounding.AwayFromZero);

现在您在visual studio上看到的消息是否为虚警,因为visual studio无法将web.config编译为IIS ...实际上删除工作并运行该站点。

最后我喜欢说你,我不确定你可以从那个oracle客户端删除中获得多少,因为这只是检查web.config中是否有任何数据库连接,如果不存在实际上没有做任何事情

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