我有几个C#项目,在某种意义上是一个单元。有几个常见的AssemblyInfo属性可以在它们之间共享(例如,公司名称)。因此,我创建了一个共享文件,所有项目都包括其中,其中包含(例如) AssemblyCompany
[assembly: AssemblyCompany("Acme Inc.")]我从每个项目的单个AssemblyInfo.cs中删除了相应的属性。
这一切都进行得很好,但我想在一个案例中更进一步:版权。出版的第一年因项目而异,因此它们确实应该有不同的版权字符串。所以我想在共享文件中做这样的事情:
[assembly: AssemblyCopyright(string.Format("Copyright {$0} Acme Inc.", Acme.AssemblyInfo.FirstPublicationYear)]然后让每个单独的项目定义自己的特定Acme.AssemblyInfo.FirstPublicationYear。
我在黑暗中拍了几张不同的照片。首先,我尝试在项目的AssemblyInfo.cs中的静态类中定义一个const:
namespace Acme
{
public static class AssemblyInfo
{
public const int FirstPublicationYear = 2015;
}
}这导致错误“属性参数必须是属性参数类型的常量表达式、类型表达式或数组创建表达式”。因此,我尝试创建一个属性类:
namespace Acme
{
using System;
[AttributeUsage(AttributeTargets.Assembly)]
public class FirstPublicationYearAttribute : Attribute
{
private int year;
public FirstPublicationYearAttribute(int year)
{
this.year = year;
}
}
}将该属性添加到单个项目的AssemblyInfo.cs中:
[assembly: Acme.FirstPublicationYear(2015)]但是,我不知道如何(或者即使可以)适当地更改共享属性文件中的AssemblyCopyright行。我试过几种没用的方法。第一:
[assembly: AssemblyCopyright(string.Format("Copyright © {$0} Acme, Inc.", Acme.FirstPublicationYear))]..。这告诉我FirstPublicationYear在名称空间Acme中不存在。所以我想也许我会让它看起来更像一个属性:
[assembly: AssemblyCopyright(string.Format("Copyright © {$0} Acme, Inc.", [assembly: Acme.FirstPublicationYear]))]..。它告诉我“无效的表达式‘[’‘”)。
有办法完成我在这里想做的事吗?谢谢。
发布于 2015-01-27 22:47:56
与其使用string.Format,不如尝试连接它:
"Copyright" + Acme.AssemblyInfo.FirstPublicationYear + "Acme Inc."编译器将能够使编译时间常量由此。
发布于 2015-01-27 22:50:56
没有使用代码来完成这一任务的好方法。原因是属性必须有编译时值才能正确地将数据输出到结果文件,因此无法从各个部分逻辑地构建它们,因为从定义上说,该生成是一个运行时操作,而不是编译时操作。
编辑:--即使在编译时,使用+运算符连接字符串也是可能的,只要所有被连接的字符串本身都是常量。看弗兰克的答案。
但是,由于所有这些值都来自单个共享文件,因此可以通过编写预构建批处理文件来实现这一点。我已经在预构建步骤中将其作为一个简单的调用实现到生产代码,使用C#编写了上述助手。只要repo忽略输出文件(通常是AssemblyInfo.cs) (如果您不使用回购,切换到一个),您就可以依赖由预构建生成的文件,然后编译器找到该文件,即使它实际上并不是被复制下来的。
https://stackoverflow.com/questions/28181373
复制相似问题