我创建了一个T4模板来生成一个分部类。它引用了我的一个DLL:
<#@ assembly name="$(ProjectDir)..\Base\bin\Debug\net8.0\Base.dll" #>
字符串如果DLL不存在,我的模板就会出错。我希望它能正常运行。如果DLL存在,我想生成一个类并实现它的方法。如果不存在,我想用空方法生成类。如何做到这一点?
9q78igpj1#
您将需要使用System.Reflection和运行时程序集加载-使用<#@ assembly为从T4文件生成的隐式程序集配置一个 * 编译时 * 程序集引用,如果程序集不存在,这显然将无法工作。如果DLL不存在,我的模板就会出错。我希望它能正常运行。我看到你正在使用$(ProjectDir),它可以是一个MSBuild参数,或者作为环境变量传递,或者通过T4中的this.Host访问,或者通过EnvDTE强耦合到VS-所以这取决于T4是如何执行的(T4文件通常在 * Visual Studio中运行,但是它们还需要在EnvDTE不可用的dotnet build或msbuidl下运行。您需要弄清楚该需求并选择适当的响应。但是,* 除此之外 *,做这样的事情:
System.Reflection
<#@ assembly
$(ProjectDir)
this.Host
EnvDTE
dotnet build
msbuidl
<# 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 {} <# } #>
字符串
1条答案
按热度按时间9q78igpj1#
您将需要使用
System.Reflection
和运行时程序集加载-使用<#@ assembly
为从T4文件生成的隐式程序集配置一个 * 编译时 * 程序集引用,如果程序集不存在,这显然将无法工作。如果DLL不存在,我的模板就会出错。我希望它能正常运行。
我看到你正在使用
$(ProjectDir)
,它可以是一个MSBuild参数,或者作为环境变量传递,或者通过T4中的this.Host
访问,或者通过EnvDTE
强耦合到VS-所以这取决于T4是如何执行的(T4文件通常在 * Visual Studio中运行,但是它们还需要在EnvDTE
不可用的dotnet build
或msbuidl
下运行。您需要弄清楚该需求并选择适当的响应。但是,* 除此之外 *,做这样的事情:
字符串