如何在Template Codes 中能够加载所在的Project的Assembly,获取所有Type
1.首先要获取Project对象
2.分析得到Project对象生成的bin路径,也就是$(TargetPath)
3.Assembly.LoadFromFile( binpath )
4.asm.GetTypes(),这里要注意处理Reference Project
代码如下:
1.GetProject()
Project GetProject()
{
var hostServiceProvider = (IServiceProvider)this.Host;
var dte = (DTE)hostServiceProvider.GetService(typeof(DTE));
var item = dte.Solution.FindProjectItem(this.Host.TemplateFile);
if (item != null && item.ContainingProject != null)
{
return item.ContainingProject;
}
return null;
}
2.GetAssemblyPath,GetAssemblyDir(获取bin目录)
string GetAssemblyPath(EnvDTE.Project vsProject)
{
string fullPath = vsProject.Properties.Item("FullPath").Value.ToString();
string outputPath = vsProject.ConfigurationManager.ActiveConfiguration.Properties.Item("OutputPath").Value.ToString();
string outputDir = Path.Combine(fullPath, outputPath);
string outputFileName = vsProject.Properties.Item("OutputFileName").Value.ToString();
string assemblyPath = Path.Combine(outputDir, outputFileName);
return assemblyPath;
}
string GetAssemblyDir(EnvDTE.Project vsProject)
{
string fullPath = vsProject.Properties.Item("FullPath").Value.ToString();
string outputPath = vsProject.ConfigurationManager.ActiveConfiguration.Properties.Item("OutputPath").Value.ToString();
string outputDir = Path.Combine(fullPath, outputPath);
return outputDir;
}
3.获取asm中所有interface
Type[] GetInterfaces()
{
var p = GetProject();
string str = GetAssemblyPath(p);
var asm = Assembly.LoadFile(str);
Type[] tps = new Type[]{};
try
{
tps = asm.GetTypes();
}
catch (ReflectionTypeLoadException ex)
{
foreach (Exception loaderException in ex.LoaderExceptions)
{
WriteLine(loaderException.ToString());
}
}
return tps.ToOtherTypeArrayEx(i=>i.IsInterface,i=>i);
}
最后要注意Reference :
<#
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
#>
<#+
System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
var strDllDir = GetAssemblyDir(GetProject());
var strs = args.Name.Split(',');
var strNeedResolveDllPath = strDllDir + strs[0] + ".dll"; if (System.IO.File.Exists(strNeedResolveDllPath))
return Assembly.LoadFile(strNeedResolveDllPath);
return null;
}
#>
一些参考:
http://msdn.microsoft.com/en-us/library/envdte.dte.aspx
http://msdn.microsoft.com/en-us/library/vstudio/gg604090(v=vs.100).aspx
http://stackoverflow.com/questions/3548026/get-referenced-projects-path-in-t4-template
http://stackoverflow.com/questions/12952110/accessing-projects-via-dte-in-c-sharp-t4-template
http://stackoverflow.com/questions/5486593/getting-the-macro-value-of-projects-targetpath-via-dte
http://social.msdn.microsoft.com/Forums/vstudio/en-US/03d9d23f-e633-4a27-9b77-9029735cfa8d/how-to-get-the-right-output-path-from-envdteproject-by-code-if-show-advanced-build?forum=vsx
如何在Template Codes 中能够加载所在的Project的Assembly,获取所有Type的更多相关文章
- cocos2dx lua中异步加载网络图片,可用于显示微信头像
最近在做一个棋牌项目,脚本语言用的lua,登录需要使用微信登录,用户头像用微信账户的头像,微信接口返回的头像是一个url,那么遇到的一个问题就是如何在lua中异步加载这个头像,先在引擎源码里找了下可能 ...
- django模板中自动加载static
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join( ...
- Angular中懒加载一个模块并动态创建显示该模块下声明的组件
angular中支持可以通过路由来懒加载某些页面模块已达到减少首屏尺寸, 提高首屏加载速度的目的. 但是这种通过路由的方式有时候是无法满足需求的. 比如, 点击一个按钮后显示一行工具栏, 这个工具栏组 ...
- iOS 解决LaunchScreen中图片加载黑屏问题
iOS 解决LaunchScreen中图片加载黑屏问题 原文: http://blog.csdn.net/chengkaizone/article/details/50478045 iOS 解决Lau ...
- 出现了内部错误-网站中X509Certificate2加载证书时出错
今天给网站配置了加密证书文件,用类X509Certificate2加载证书文件时,一直报出现了内部错误,但是Demo中用控制台程序加载证书没任何问题 读取证书文件的语句: X509Certificat ...
- iOS App中数据加载的6种方式
我们看到的APP,往往有着华丽的启动界面,然后就是漫长的数据加载等待,甚至在无网络的时候,整个处于不可用状态.那么我们怎么处理好界面交互中的加载设计,保证体验无缝衔接,保证用户没有漫长的等待感,而可以 ...
- APP中数据加载的6种方式-b
我们看到的APP,往往有着华丽的启动界面,然后就是漫长的数据加载等待,甚至在无网络的时候,整个处于不可用状态.那么我们怎么处理好界面交互中的加载设计,保证体验无缝衔接,保证用户没有漫长的等待感,而可以 ...
- 某APK中使用了动态注册BroadcastReceiver,Launcher中动态加载此APK出现java.lang.SecurityException异常的解决方法
在某APK中,通过如下方法动态注册了一个BroadcastReceiver,代码参考如下: @Override protected void onAttachedToWindow() { super. ...
- 在ASP.NET中动态加载内容(用户控件和模板)
在ASP.NET中动态加载内容(用户控件和模板) 要点: 1. 使用Page.ParseControl 2. 使用base.LoadControl 第一部分:加载模板 下 面是一个模板“<tab ...
随机推荐
- VC++_错误 无法打开包括文件“glglut.h” No such file or directory 怎么办
在网上看到类似的问题,查找资料找到了解决方案,现整理如下,有些更改,好让自己多些印象,附原文网址:http://blog.csdn.net/bigloomy/article/details/62265 ...
- iOS开发之UITabBarController和UICollectionView的使用
这一篇要记录的是iOS开发中UITabBarController控件和UICollectionView控件的使用.APP跑起来之后的效果例如以下图: watermark/2/text/aHR0cDov ...
- Indri和Terrier搜索引擎的使用
介绍 Indri和Terrier都是开源的搜索引擎,当中Indri作为Lemur项目的一个重要部分,具有强大的查询接口,易建索引,可扩展,高效率等长处.能够在SourceForge Lemur Pro ...
- Windows下也能够使用osw追朔系统历史性能
1.Windows系统历史性能分析困难背景 在Linux/Unix上.要追朔历史性能,一般採用部署nmon进行性能监控採集与存储的方式实现.可是却没有在Windows上的版本号. Windows系统假 ...
- JavaScript 刚開始学习的人应知的 24 条最佳实践
原文:24 JavaScript Best Practices for Beginners (注:阅读原文的时候没有注意公布日期,认为不错就翻译了,翻译到 JSON.parse 那一节认为有点不正确路 ...
- Intel Active Management Technology
http://en.wikipedia.org/wiki/Intel_Active_Management_Technology Intel Active Management Technology F ...
- 程序设计之另一种读写函数---writev,readv
read()和write()系统调用每次在文件和进程的地址空间之间传送一块连续的数据.但是,应用有时也需要将分散在内存多处地方的数据连续写到文件中,或者反之.在这种情况下,如果要从文件中读一片连续的数 ...
- app上架的照片尺寸大小
- (C)strcpy ,strncpy与strlcpy
1. 背景 好多人已经知道利用strncpy替代strcpy来防止缓冲区越界. 但是如果还要考虑运行效率的话,也许strlcpy是一个更好的方式. 2. strcpy strcpy 是依据 /0 作为 ...
- Go——godoc命令简介
前言 godoc的一些简记 命令 godoc的列表 | godoc的chm下载 查看godoc的所有命令 `$ godoc -h` usage: godoc -http=localhost:6060 ...