C# T4代码需要库项目目录,但它使用库获取应用程序的目录

C# T4代码需要库项目目录,但它使用库获取应用程序的目录,c#,.net,visual-studio,t4,C#,.net,Visual Studio,T4,我正在编写一个.NET标准库,供几个应用程序使用。在我的库项目中,我使用构建时T4模板来收集有关库的一些构建信息,以便在运行时可以访问库。我需要的信息之一是库项目的源(项目)目录。我想通过获取CWD并从中推断出库源目录来实现这一点。不幸的是,当我构建使用库的应用程序时,库的T4代码将CWD视为应用程序的输出目录,而不是库。无论何时构建库,T4代码都有办法获取库的源代码项目目录吗?经过一些更不成功的研究,我决定使用一个预构建事件来创建一个小C#文件,该文件定义了一个静态类,其中包含从CWD分配的成

我正在编写一个.NET标准库,供几个应用程序使用。在我的库项目中,我使用构建时T4模板来收集有关库的一些构建信息,以便在运行时可以访问库。我需要的信息之一是库项目的源(项目)目录。我想通过获取CWD并从中推断出库源目录来实现这一点。不幸的是,当我构建使用库的应用程序时,库的T4代码将CWD视为应用程序的输出目录,而不是库。无论何时构建库,T4代码都有办法获取库的源代码项目目录吗?

经过一些更不成功的研究,我决定使用一个预构建事件来创建一个小C#文件,该文件定义了一个静态类,其中包含从CWD分配的成员

编辑:

…但这在Linux和Windows上都不起作用,因为shell cmd是不同的。正确的方法是创建一个T4构建模板,输出一个C#文件,如下所示:

<#@ 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)这样的宏