Visual Studio中的.NET项目是否总是编译成单个文件?

问题描述 投票:7回答:5

这是一件非常简单的事情,没有人能够在我读过的任何教程中说出来。

我一直在创建一些独立的.NET应用程序以及一些基于DLL的其他程序插件。我注意到Visual Studio中的项目,至少使用Windows应用程序和类库,编译成单个文件(EXE或DLL)。

总是这样吗?在组织更大的应用程序方面,我是否应该始终将Visual Studio中的项目视为与最终程序中的单个文件相对应?

.net visual-studio projects
5个回答
3
投票

每个项目都会编译为单个文件。 (网站项目除外)

但是,如果将项目中的任何文件的“构建操作”设置为“始终复制”或“如果较新则复制”,则项目会将该文件复制到输出文件夹。 此外,如果EXE项目具有App.config文件,它也将被复制到输出文件夹。

如果您的项目引用了不属于核心框架的DLL(无论是您自己的还是其他人),它会将该DLL复制到项目的输出文件夹中,从而生成两个文件(尽管其中只有一个文件包含来自项目本身)

此外,除了DLL和EXE之外,Visual Studio还将在输出文件夹中创建包含调试符号的.pdb文件。此文件由调试器使用,不得分发给您的用户。 (除非您希望他们为您调试代码)


2
投票

对于您的简单项目,是的,您将始终为每个项目获得一个程序集。但是,如果您转向更多生产就绪的软件,答案就不同了。假设您要传递DLL,但它包含必须向用户显示的文本。您可能希望本地化该文本(提供英语和德语版本,甚至美英英语和英国英语[思考程序与程序])。您将文本放入资源,然后将这些资源编译为所谓的附属程序集。您将为每个您选择支持的区域设置获得一个附属程序集。

以下是关于如何生成和使用附属程序集的快速说明:http://sanjaysainitech.blogspot.com/2007/08/satellite-assemblies.html

我看到有人在谈论netmodules和ILMerge。我认为如果你担心netmodules然后你做错了,因为你没有使用微软给你的工具(或者你在Mono土地上结束了,在这种情况下你没有微软的任何工具)。我没有使用ILMerge,但在阅读之后我不确定我是否相信它。 This person说除了WPF / XAML代码之外它工作正常;运行ILMerge后,this person无法访问嵌入式资源; this person看到了运行ILMerge后使用调试器无法步进的优化代码。这足以告诉我ILMerge不是适用于所有场景的生产就绪工具。设计软件的一部分是弄清楚如何部署它。如果要部署较少数量的程序集,则应该在编译之后以这种方式设计软件,而不是在IL中进行混乱。正如制图师常说的那样,“这里有龙。”


2
投票

示例如何创建多个模块并将主题链接到单个dll中:

csc /t:module RarelyUsedTypes.cs
csc /out:AllTypes.dll /t:library /addmodule:RarelyUsedTypes.netmodule AllTypes.cs 

有关更多信息,请参阅Richter的书CLR via C#

您可以为Visual Studio自动执行此过程。

对于每个项目,创建一个netmodule或一个程序集,并将它们编译/合并到一个程序集中。

第一种选择。这是由Jay R. Wren提出的:

这是一个可爱的黑客,但CSC和VBC都支持/target:module/addmodule选项,你实际上可以通过使用shell脚本或make文件在没有ILMerge的情况下执行此操作。

Visual Studio不支持“netmodule”类型,但MSBuild支持。

将VB项目添加到您的解决方案中。卸载项目并编辑项目文件。

将OutputType更改为模块:

<OutputType>module</OutputType>

我们不添加对所需项目的引用,而是添加一个模块。可悲的是,VStudio再次失败,但MSBUILD工作得很好。卸载项目并编辑项目文件。使用AddModules include指令添加项组。

<ItemGroup><AddModules Include="..\VbXml\bin\Debug\VbXml.netmodule" /></ItemGroup>

这将告诉msbuild告诉CSC使用/addmodule指令,就像Studio管理的参考项目组一样。

主要缺点:添加模块没有Visual Studio Intellisense。我们已经有了参考资料,太糟糕了,我们没有模块。 [更新:正如@Ark-kun所指出的,Visual Studio可以引用.netmodule项目并具有Intellisense。只需在更改输出类型之前添加项目引用。]

SharpDevelop迈出了第一步,但第二步,“添加模块”gui自SD 2.0以来一直作为低优先级项目开放。

第二种选择。这个great article(由Scott Hanselman撰写)描述了如果你使用Visual Studio如何自动编译程序集。它确实为您提供了IntelliSense支持 ,与第一种选择不同 。


1
投票

不必要。如果您的项目具有面向文化的资源,则通常将它们编译为单独的程序集(dll)。此外,ASP.Net项目不会编译成单个程序集,您将始终将您的aspx / ascx文件或其标记等效文件与编译代码分开。


1
投票

对于Visual Studio,是的。在互联网上搜索“netmodule”,您将找到您正在寻找的文档。我今天偶然遇到它们,因为我们正在寻找将多个项目组合成一个DLL。

MSDN:https://docs.microsoft.com/en-us/dotnet/framework/app-domains/how-to-build-a-multifile-assembly

© www.soinside.com 2019 - 2024. All rights reserved.