如何确保对C#项目中配置文件的更改导致DLL被重新生成
本文关键字:DLL 新生 配置文件 确保 何确保 项目 | 更新日期: 2023-09-27 18:23:53
我在Visual Studio 2015中有一个C#DLL项目(a),其中有一个自定义配置文件,我想将其复制到输出,因此"复制到输出目录"设置为"如果更新则复制"。此DLL被同一解决方案中的另一个项目(B)引用。每当我重建项目B时,项目A中的配置文件都会复制到它的输出目录中。
问题是,如果我只修改配置文件,它不会被复制到输出中。我认为这是因为项目A的输出没有更改,所以MSBuild不需要将其复制到项目B的输出目录中。
我找到的一个解决方法是将配置文件的"内容类型"设置为"嵌入式资源",这会导致每当配置文件更改时都会重新生成项目A。这是有效的,但有点像黑客。有没有更好的方法可以在不将配置文件包含在DLL中的情况下获得相同的行为?
好吧,我想我已经找到了一种方法。在Microsoft.CSharp.Core.targets
中定义了一个CustomAdditionalCompileInputs
项目组,CoreCompile
目标取决于此。因此,我简单地添加了以下目标,使CoreCompile依赖于所有具有构建操作None
或Content
的文件:
<Target Name="EnsureRecompiledOnConfigFileChanges" BeforeTargets="BeforeBuild">
<!-- Recompile the project if any items of type "None" or "Content" change in case some of them are config files for a DLL. -->
<ItemGroup>
<CustomAdditionalCompileInputs Include="@(None)" />
<CustomAdditionalCompileInputs Include="@(Content)" />
</ItemGroup>
</Target>
您可以通过在项目B的项目设置中使用后期生成的事件命令来实现这一点,而不是使用"Copy if later"。只需设置一个xcopy命令,即可将web.config从项目A目录复制到项目B的生成输出文件夹中。有一些构建参数有助于设置正确的目录,而不是对所有目录名称进行硬编码。
看看这个stackoverflow帖子:
使用生成后事件将文件从一个项目复制到另一个项目。。。VS2010
通常在使用DLL时,您不会配置DLL,而是在项目中使用DLL。
为了解释,假设您有一个DLL,可以在两个可执行项目中重用。项目B引用项目A,项目C引用项目A。在这种情况下,项目A是DLL,项目B和项目C是可执行文件。让我们进一步假设项目A使用配置设置,但项目B和项目C的实际值需要不同。
在这种情况下,您要做的是在exe B和exe C的应用程序配置中指定dll所需的设置。还要注意,当部署应用程序时,配置可能会再次不同。
为了展示如何在应用程序配置中包括DLL的配置,我创建了以下内容。最重要的是如何在最终的app.config.中使用命名空间
类库
namespace ClassLibrary1
{
public class Class1
{
public string Message()
{
return Settings.Default.Message;
}
}
}
控制台应用程序
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(new Class1().Message());
Console.WriteLine(Settings.Default.Message);
Console.ReadKey();
}
}
}
控制台应用程序的配置
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="ConsoleApplication3.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<section name="ClassLibrary1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<applicationSettings>
<ConsoleApplication3.Properties.Settings>
<setting name="Message" serializeAs="String">
<value>Hello from application</value>
</setting>
</ConsoleApplication3.Properties.Settings>
<ClassLibrary1.Properties.Settings>
<setting name="Message" serializeAs="String">
<value>Hello from DLL</value>
</setting>
</ClassLibrary1.Properties.Settings>
</applicationSettings>
</configuration>
使用dll运行此应用程序将显示以下输出
Hello from DLL
Hello from application
我希望这能有所帮助。
如果您使用VS 2015,您也可以使用所谓的共享项目,当您引用共享项目时,共享项目中包含的源代码文件将被复制并同步到引用项目。通过这种方式,您可以将配置文件同步到其他引用项目,甚至在构建之前就可以同步。