C# T4代码需要库项目目录,但它使用库获取应用程序的目录
我正在编写一个.NET标准库,供几个应用程序使用。在我的库项目中,我使用构建时T4模板来收集有关库的一些构建信息,以便在运行时可以访问库。我需要的信息之一是库项目的源(项目)目录。我想通过获取CWD并从中推断出库源目录来实现这一点。不幸的是,当我构建使用库的应用程序时,库的T4代码将CWD视为应用程序的输出目录,而不是库。无论何时构建库,T4代码都有办法获取库的源代码项目目录吗?经过一些更不成功的研究,我决定使用一个预构建事件来创建一个小C#文件,该文件定义了一个静态类,其中包含从CWD分配的成员 编辑: …但这在Linux和Windows上都不起作用,因为shell cmd是不同的。正确的方法是创建一个T4构建模板,输出一个C#文件,如下所示:C# T4代码需要库项目目录,但它使用库获取应用程序的目录,c#,.net,visual-studio,t4,C#,.net,Visual Studio,T4,我正在编写一个.NET标准库,供几个应用程序使用。在我的库项目中,我使用构建时T4模板来收集有关库的一些构建信息,以便在运行时可以访问库。我需要的信息之一是库项目的源(项目)目录。我想通过获取CWD并从中推断出库源目录来实现这一点。不幸的是,当我构建使用库的应用程序时,库的T4代码将CWD视为应用程序的输出目录,而不是库。无论何时构建库,T4代码都有办法获取库的源代码项目目录吗?经过一些更不成功的研究,我决定使用一个预构建事件来创建一个小C#文件,该文件定义了一个静态类,其中包含从CWD分配的成
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.IO" #>
<#@ output extension=".cs" #>
using System;
namespace BC.LocationEngine
{
public static class VersionInfo
{
public static string BuildTime = @"<#=DateTime.Now #>";
public static string BuildPath = @"<#=Host.ResolvePath(".")#>";
public static string BuildDir = @"<#=Path.GetDirectoryName(this.Host.TemplateFile)#>";
}
}
使用制度;
命名空间BC.LocationEngine
{
公共静态类VersionInfo
{
公共静态字符串BuildTime=@“”;
公共静态字符串BuildPath=@“”;
公共静态字符串BuildDir=@”;
}
}
请注意“hostspecific=“true”
然后将C#文件添加到项目中
(BuildPath和BuildDir是获得相同内容的两种不同方式)通常由可执行项目来管理工作目录,或者实际上是可执行文件的执行者。因此,在本例中,转到exe项目的调试属性,并将工作目录设置为项目文件夹。您应该能够使用像$(ProjectDir)这样的宏