.net 如何避免T4模板上的DLL找不到错误?

y53ybaqx  于 2023-11-20  发布在  .NET
关注(0)|答案(1)|浏览(175)

我创建了一个T4模板来生成一个分部类。
它引用了我的一个DLL:

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

字符串
如果DLL不存在,我的模板就会出错。我希望它能正常运行。
如果DLL存在,我想生成一个类并实现它的方法。如果不存在,我想用空方法生成类。
如何做到这一点?

9q78igpj

9q78igpj1#

您将需要使用System.Reflection和运行时程序集加载-使用<#@ assembly为从T4文件生成的隐式程序集配置一个 * 编译时 * 程序集引用,如果程序集不存在,这显然将无法工作。
如果DLL不存在,我的模板就会出错。我希望它能正常运行。
我看到你正在使用$(ProjectDir),它可以是一个MSBuild参数,或者作为环境变量传递,或者通过T4中的this.Host访问,或者通过EnvDTE强耦合到VS-所以这取决于T4是如何执行的(T4文件通常在 * Visual Studio中运行,但是它们还需要在EnvDTE不可用的dotnet buildmsbuidl下运行。您需要弄清楚该需求并选择适当的响应。
但是,* 除此之外 *,做这样的事情:

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

#>

字符串

相关问题