.net 在生成期间删除未使用的类和资源

.net 在生成期间删除未使用的类和资源,.net,msbuild,.net,Msbuild,这个问题更多的是理论性质,而不是实际用途 我知道有几个程序可以找到未使用的代码,但这个问题与那个问题有点不同 是否有可能在构建期间或之后找到未使用的代码和资源并将其删除?我有几个“通用”库,在许多项目中共享,每个项目只使用这些库的一部分(重叠,将来可能会更改,因此不可能进行直接重构,我不想进一步细分这些库)。我的想法是删除这些未使用的部分,以保持生成的文件较小 那么,我成功的几率有多大呢?这是JIT编译器的一个非常好的特性:它只编译实际执行的代码。DLL中的死代码将永远不会被使用。它甚至不会被加

这个问题更多的是理论性质,而不是实际用途

我知道有几个程序可以找到未使用的代码,但这个问题与那个问题有点不同

是否有可能在构建期间或之后找到未使用的代码和资源并将其删除?我有几个“通用”库,在许多项目中共享,每个项目只使用这些库的一部分(重叠,将来可能会更改,因此不可能进行直接重构,我不想进一步细分这些库)。我的想法是删除这些未使用的部分,以保持生成的文件较小

那么,我成功的几率有多大呢?

这是JIT编译器的一个非常好的特性:它只编译实际执行的代码。DLL中的死代码将永远不会被使用。它甚至不会被加载到内存中。例如,您可以从程序的VM大小中减少10KB。这在32位机器上节省了0.0005%

不用麻烦了。

这是JIT编译器非常好的特性之一:它只编译实际执行的代码。DLL中的死代码将永远不会被使用。它甚至不会被加载到内存中。例如,您可以从程序的VM大小中减少10KB。这在32位机器上节省了0.0005%


不用麻烦。

我所知道的所有商业混淆器都会选择性地删除未使用的代码。我不知道有没有免费的解决方案(他们所有的免费试用版都不包括此功能)。

我知道的所有商用模糊器都会选择性地删除未使用的代码。我不知道有什么免费的解决方案(他们所有的免费试用版都不包括这个功能)。

Mono框架中有一个工具叫做

链接器是一种工具,您可以使用它只提供运行一组程序可能需要的最小函数集,而不是完整的库


不幸的是,似乎没有任何预构建的二进制文件。您必须克隆并自己构建。它位于
/mcs/tools/linker
下,需要Cecil库作为依赖项。

Mono框架中有一个工具名为

链接器是一种工具,您可以使用它只提供运行一组程序可能需要的最小函数集,而不是完整的库


不幸的是,似乎没有任何预构建的二进制文件。您必须克隆并自己构建。它生活在
/mcs/tools/linker
下,需要Cecil库作为依赖项。

实际上,删除死代码有时很有用。它可以节省工作集(比VM大小重要得多)和分发大小,有时甚至可以节省很多。死代码永远不会进入RAM。图像会逐页映射到内存中。映射的每个页面可能包含一定数量的死(IL)代码。不会有任何死掉的(本机)代码,但死掉的(IL)代码仍然会从磁盘读取,并且至少会占用工作集空间一段时间。@Stephen:如果对未使用代码的短暂分页足够严重,会造成问题(即,删除它会产生明显的差异),那么您就有更大的问题。@Richard:在我自己的情况下,我有一个特定的库,大小为几兆字节。我的17KB应用程序中只使用了少数几个类——确切地说,是1-2%。我不知道删除死掉的代码是否会产生“明显的”区别,但它至少会起到一些作用。如果没有其他内容,它将大大减少可再发行的大小。:)实际上,删除死代码有时是有用的。它可以节省工作集(比VM大小重要得多)和分发大小,有时甚至可以节省很多。死代码永远不会进入RAM。图像会逐页映射到内存中。映射的每个页面可能包含一定数量的死(IL)代码。不会有任何死掉的(本机)代码,但死掉的(IL)代码仍然会从磁盘读取,并且至少会占用工作集空间一段时间。@Stephen:如果对未使用代码的短暂分页足够严重,会造成问题(即,删除它会产生明显的差异),那么您就有更大的问题。@Richard:在我自己的情况下,我有一个特定的库,大小为几兆字节。我的17KB应用程序中只使用了少数几个类——确切地说,是1-2%。我不知道删除死掉的代码是否会产生“明显的”区别,但它至少会起到一些作用。如果没有其他内容,它将大大减少可再发行的大小。:)-1、不在.NET中他们不会。。。。(+1,我看错了,我以为你说的是编译器,不是优化器)-1,不是在.NET中他们不会。。。。(+1,我看错了,我以为你说的是编译器,不是优化器)