如何避免在T4模板上找不到DLL错误?

问题描述 投票:0回答:1

我创建了一个 T4 模板来生成一个部分类。

它引用了我的一个 DLL:

<#@ assembly name="$(ProjectDir)..\Base\bin\Debug\net8.0\Base.dll" #>

如果 DLL 不存在,我的模板就会出错。我希望它运行时没有错误。

如果DLL存在,我想生成一个类并实现它的方法。 如果没有,我想用空方法生成类。

如何实现这一目标?

c# .net templates t4 assembly-loading
1个回答
0
投票

您需要使用

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 {} <# } #>

© www.soinside.com 2019 - 2024. All rights reserved.