视觉工作室一个项目与几个DLL作为输出?

我正在编写一个插件支持的项目。 由于许多插件是相对较小的(只有一个源文件/类),我想在Visual Studio中的一个项目中,他们都成功,但要做到这一点,我需要每个源文件/类被编译到它的自己的dll文件,这可能使用visual studio吗?

如果这是不可能的视觉工作室,是否有可能使用另一个生成系统,而仍然编码和debugging与视觉工作室?

目前我已经将plugins项目输出types设置为控制台,并编写了一个main()方法,它将编译源代码目录中的所有.cs文件,并将其复制到适当的目录中。 然后,我将该控制台应用程序设置为插件项目的构build后事件。 它的工作,但它似乎是一个非常丑陋的黑客。

使用visual studio 2010。

您可以为每个插件创build一个项目,并将解决scheme中的所有项目分组。

如果你不想每个插件都有一个项目,你可以使用CSC任务创build一个使用MSBuild的自定义版本

如何为每个插件文件生成一个DLL

  1. 在一个项目中添加所有的插件文件
  2. 编辑项目文件以指定哪个类将生成一个插件库:

    <ItemGroup> <Compile Include="Class1.cs"> <Plugin>true</Plugin> </Compile> <Compile Include="Class2.cs" /> <Compile Include="Class3.cs"> <Plugin>true</Plugin> </Compile> <Compile Include="Program.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> </ItemGroup> 
  3. 在项目文件中添加一个新的目标来生成插件库

     <Target Name="BuildPlugins"> <CSC Condition="%(Compile.Plugin) == 'true'" Sources="%(Compile.FullPath)" TargetType="library" OutputAssembly="$(OutputPath)%(Compile.FileName).dll" EmitDebugInformation="true" /> </Target> 
  4. 如果您想在每次构build之后创build插件库,请添加一个构build目标:

     <Target Name="AfterBuild" DependsOnTargets="BuildPlugins"> </Target> 

你只需要创build一个Solution然后添加你想要的项目。

你可以像5 Class Library项目一样编译并生成5个DLL。

为了扩展Julien Hoarau的回答,下面是一个解决scheme,它允许你从单个项目中编译多个DLL文件,并且可以从多个CS文件中编译这些DLL文件。 只需打开你的csproj文件,并在</ Project>标签之前添加:

  <!-- Plugin Building --> <!-- 1. Hardlink to NuGet References - CSC does not read HintPaths, so you will have to create these for all your packages --> <ItemGroup> <PluginReference Include="..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll" ><InProject>false</InProject></PluginReference> <PluginReference Include="..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.Helpers.dll" ><InProject>false</InProject></PluginReference> <PluginReference Include="..\packages\Microsoft.AspNet.Mvc.5.2.3\lib\net45\System.Web.Mvc.dll" ><InProject>false</InProject></PluginReference> <PluginReference Include="..\packages\Microsoft.AspNet.Web.Optimization.1.1.3\lib\net40\System.Web.Optimization.dll" ><InProject>false</InProject></PluginReference> <PluginReference Include="..\packages\Microsoft.AspNet.Razor.3.2.3\lib\net45\System.Web.Razor.dll" ><InProject>false</InProject></PluginReference> </ItemGroup> <!-- 2. Each Plugin CS Files --> <!-- You see that each tag in here has it's own name starting with Plugin --> <!-- We can reference that later eg as @(PluginBlue) to get an array list to pass to the CSC sources, allowing us to have multiple files --> <!-- Plugin.Blue\**\*.cs gets all the files in the "Plugin.Blue" folder --> <!-- Plugin.Green just has a specific file list --> <ItemGroup> <PluginBlue Include="Plugin.Blue\**\*.cs"><InProject>false</InProject></PluginBlue> <PluginGreen Include="Plugin.Green\File1.cs"><InProject>false</InProject></PluginGreen> <PluginGreen Include="Plugin.Green\File2.cs"><InProject>false</InProject></PluginGreen> </ItemGroup> <!-- 3. Build each Plugin --> <Target Name="BuildPlugins"> <!-- Plugin Blue --> <CSC Sources="@(PluginBlue)" References="@(PluginReference)" TargetType="library" OutputAssembly="$(OutputPath)Plugin.Blue.dll" EmitDebugInformation="true" /> <!-- Plugin Green --> <CSC Sources="@(PluginGreen)" References="@(PluginReference)" TargetType="library" OutputAssembly="$(OutputPath)Plugin.Green.dll" EmitDebugInformation="true" /> </Target> <!-- 4. Require Build on Solution Compile --> <Target Name="AfterBuild" DependsOnTargets="BuildPlugins"> </Target> 

这是我的方法 – 它可以让你把所有东西都组织在底部,而不是分散在整个项目文件中。 运用

 <InProject>false</InProject> 

允许我们从SolutionExplorer隐藏文件,并有一个单独的定义的文件列表,而不是简单地将插件标签添加到我们想要的文件。 在你的主要解决scheme中,一定要将所有正在编译的文件的生成操作设置为“无”,这样在主项目文件中就不会有重复。

关于CSC的更多阅读:

https://msdn.microsoft.com/zh-cn/library/78f4aasd.aspx使用csc.exe进行命令行构build

https://msdn.microsoft.com/en-us/library/ms379563(v=vs.80).aspx使用C#2.0命令行编译器

https://msdn.microsoft.com/en-us/library/s5c8athz.aspx Csc任务

https://msdn.microsoft.com/en-us/library/7szfhaft.aspx MSBuild条件

我希望这对某人有用。

如果你想让每个代码文件成为自己的DLL,那么你必须为每个代码文件创build一个新的项目。 但是你可以把多个项目文件(.csproj)放到一个大的解决scheme中。

如果这不适合你,那么你总是可以使用命令行来编译你的项目。 这将允许您自定义您的构build以满足您的需求。 例如,你可以编写一个批处理脚本或一个PowerShell脚本,将所有的代码文件编译成一个单独的DLL。