T4模板和Assembly.Load

6

这是我在StackOverflow上的第一个问题,所以你好 :)

在t4模板中,是否可以使用Assembly.Load()按程序集名称加载程序集?我想使用它来获取已加载程序集中所有带有ServiceContract属性的类型。

    var loadedAssembly = Assembly.Load(assemblyName);
    var types = from type in loadedAssembly.GetTypes()
    where Attribute.IsDefined(type, typeof(ServiceContractAttribute))select type;

我希望我的模板所在的项目引用了期望的程序集。我已经找出

    <#@ assembly name="$(TargetDir)\DesiredAssemblyName.dll" #>
    var loadedAssembly = Assembly.GetAssembly(typeof(SomeType));

这个方法可以工作,但似乎不是很好的解决方案。此外,我希望该模板在构建后进行转换,并且当我将以下行添加到.csproj时:

      <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\
         TextTemplating\v10.0\Microsoft.TextTemplating.targets"/>
      <PropertyGroup>
         <TransformOnBuild>true</TransformOnBuild>
      </PropertyGroup>
      <ItemGroup>
         <!--Add VS\...\PublicAssemblies to the list of places
         to look for assemblies used by templates.--> 
         <T4ReferencePath Include="..\Onii.Vespa.AppServer\"/>
      </ItemGroup>

使用Assembly.GetAssembly的解决方案也不起作用。感谢所有的建议。


你看过这个吗?https://dev59.com/znA75IYBdhLWcg3wK1wp - devlife
哇!你的情况和我的一模一样,甚至包括 wcf 属性检查!你解决了吗?我正在尝试使用 ShadowCopy 手动加载程序集,以防止 T4 模板中使用的 dlls 锁定问题。 - julealgon
很遗憾,不行。只有在我知道结果会改变的时候,我才手动执行它。 - Kapitán Mlíko
2个回答

1

0

我在使用Microsoft.TextTemplating.targets指令时遇到了同样的问题。你可以在.csproj文件的末尾添加转换命令作为一种可能的解决方法:

<Target Name="AfterBuild">
  <Exec Command="&quot;%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\TextTransform&quot; -P &quot;..\Onii.Vespa.AppServer\&quot; -I &quot;$(ProjectDir.TrimEnd('\'))&quot; YourTemplate.tt" />
</Target>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接