我创建了一个 T4 模板来生成一个部分类。
它引用了我的一个 DLL:
<#@ assembly name="$(ProjectDir)..\Base\bin\Debug\net8.0\Base.dll" #>
如果 DLL 不存在,我的模板就会出错。我希望它运行时没有错误。
如果DLL存在,我想生成一个类并实现它的方法。 如果没有,我想用空方法生成类。
如何实现这一目标?
您需要使用
System.Reflection
和运行时程序集加载 - 使用 <#@ assembly
为从 T4 文件生成的隐式程序集配置一个 编译时程序集引用,如果程序集不运行,这显然将不起作用存在。
如果 DLL 不存在,我的模板就会出错。我希望它运行时没有错误。
我看到你正在使用
$(ProjectDir)
,它可以是 MSBuild 参数,或者作为环境变量传递,或者通过 T4 中的 this.Host
访问,或者通过 EnvDTE
强耦合到 VS - 所以取决于T4 的执行方式(T4 文件通常在 Visual Studio 中运行,但它们也需要在 dotnet build
或 msbuidl
下运行,其中 EnvDTE
不可用。您需要弄清楚该要求并选择适当的回应。但是除此之外,做这样的事情:
<#
DirectoryInfo projectDir = GetProjectDirFromEnvSomehow( /* EnvDTE? this.Host? Environment.GetEnvironmentVariable( "etc" ), etc etc */ );
FileInfo baseDllFile = new FileInfo( Path.Combine( projectDir.FullName, "Base.dll" ) )
if( baseDllFile.Exists )
{
// See https://learn.microsoft.com/en-us/dotnet/framework/reflection-and-codedom/how-to-load-assemblies-into-the-reflection-only-context
#>
public class Whatever
{
<#
foreach( var member in reflectedMembers ) { this.Write( "public TypeName MemberName { etc; }" ) }
#>
}
<#
}
else
{
#>
public class Whatever {}
<#
}
#>