这是关于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的解决方案也不起作用。 谢谢你的所有建议。
答案 0 :(得分:1)
您是否尝试将程序集加载到仅反射上下文?
答案 1 :(得分:0)
我使用Microsoft.TextTemplating.targets
指令遇到了同样的问题。您可以在.csproj
的末尾添加转换命令作为可能的解决方法:
<Target Name="AfterBuild">
<Exec Command=""%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\TextTransform" -P "..\Onii.Vespa.AppServer\" -I "$(ProjectDir.TrimEnd('\'))" YourTemplate.tt" />
</Target>