如何确保对C#项目中配置文件的更改导致DLL被重新生成

本文关键字:DLL 新生 配置文件 确保 何确保 项目 | 更新日期: 2023-09-27 18:23:53

我在Visual Studio 2015中有一个C#DLL项目(a),其中有一个自定义配置文件,我想将其复制到输出,因此"复制到输出目录"设置为"如果更新则复制"。此DLL被同一解决方案中的另一个项目(B)引用。每当我重建项目B时,项目A中的配置文件都会复制到它的输出目录中。

问题是,如果我只修改配置文件,它不会被复制到输出中。我认为这是因为项目A的输出没有更改,所以MSBuild不需要将其复制到项目B的输出目录中。

我找到的一个解决方法是将配置文件的"内容类型"设置为"嵌入式资源",这会导致每当配置文件更改时都会重新生成项目A。这是有效的,但有点像黑客。有没有更好的方法可以在不将配置文件包含在DLL中的情况下获得相同的行为?

如何确保对C#项目中配置文件的更改导致DLL被重新生成

好吧,我想我已经找到了一种方法。在Microsoft.CSharp.Core.targets中定义了一个CustomAdditionalCompileInputs项目组,CoreCompile目标取决于此。因此,我简单地添加了以下目标,使CoreCompile依赖于所有具有构建操作NoneContent的文件:

  <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,您也可以使用所谓的共享项目,当您引用共享项目时,共享项目中包含的源代码文件将被复制并同步到引用项目。通过这种方式,您可以将配置文件同步到其他引用项目,甚至在构建之前就可以同步。