如何在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 ...
随机推荐
- 锤子Smartisan T1手机官方4.4.2系统内核版本号信息
从锤子smartisan T1手机官方系统EGL中获取内核版本号信息(由cofface提供): I/Adreno-EGL( 816): <qeglDrvAPI_eglInitialize:41 ...
- 创建节点createElement
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- 多线程-----Thread类与Runnable接口的区别
第一个继承Thread类来实现多线程,其实是相当于拿出三件事即三个卖早餐10份的任务分别分给三个窗口,他们各做各的事各卖各的早餐各完成各的任务,因为MyThread继承Thread类,所以在newMy ...
- 《从零開始学Swift》学习笔记(Day 61)——Core Foundation框架之内存管理
原创文章,欢迎转载. 转载请注明:关东升的博客 在Swift原生数据类型.Foundation框架数据类型和Core Foundation框架数据类型之间转换过程中,尽管是大部分是能够零开销桥接,零开 ...
- SyntaxError:Strict mode does not allow function declaration in a lexically nested statement.
问题描述 使用react-native init创建了一个新项目,在package.json中使用的react-native的版本如下: "dependencies": { & ...
- jsp 中 jstl c:if等标签失效问题
<c:if test="${page == 1}"> ${s.index+1} </c:if> <c:if test="${page > ...
- Servlet session的理解
servlet参见http://blog.csdn.net/bryanliu1982/article/details/5214899 session参见http://lavasoft.blog.51c ...
- vue 中的组件通信
vue中组件通信,一般分为三种情况,父与子,子与父,子子之间. 一.父与子通信 父组件将值传给子组件,一般通过props,设置默认的类型.调用的时候通过 xx=" ", 或者:XX ...
- HUST1017 Exact cover —— Dancing Links 精确覆盖 模板题
题目链接:https://vjudge.net/problem/HUST-1017 1017 - Exact cover 时间限制:15秒 内存限制:128兆 自定评测 7673 次提交 3898 次 ...
- YTU 2422: C语言习题 n个数逆序
2422: C语言习题 n个数逆序 时间限制: 1 Sec 内存限制: 128 MB 提交: 150 解决: 96 题目描述 将n(n<20)个数按输入时顺序的逆序排列,用函数实现. 输入 ...