2013-01-03 54 views
0

我正试图在我正在编写的一个项目中使用T4代产品,但不幸的是它必须针对客户的.NET 2.0,但我似乎无法避免使用FCL 4.0库或找到一种方法VS会允许我从一个目标2.0访问4.0中的类型,目标是4.0。如何从.NET 2.0程序集间接使用FCL 4.0代码?

这个想法是声明一个T4Attribute,它可以用来装饰消耗项目中的部分类型。然后T4根据属性的细节生成该类型的额外代码。例如,标准配置模式的大多数样板部分都可以通过使用单行属性修饰添加到某个类型。

我得出自己的自定义TextTransformation来支持这一点,但因为我有VS2010我无法安装VS2005/8 SDK,只有VS2010之一,这意味着我使用的是TextTransformation在.NET 4.0 DLL(Microsoft.VisualStudio.TextTemplating.10.0)。所以该属性位于同一个DLL中,并且当我试图从消费项目中引用该DLL时,它只能看到类型,如果两者都以相同的框架版本为目标。只要项目为2.0并且库为4.0,VS就不会再找到引用的类型或名称空间。

我想它认为,因为应用程序将启动CLRv2运行,它将无法运行代码在v4 DLL(可能使用dynamic等)。但是实际上,图书馆中的类型只能在开发人员的电脑上才能看到,并通过T4模板扫描项目中的T4Attribute来告诉它生成代码 - 我假设VS2010中的T4引擎运行在CLRv4下。这些属性甚至不会编译到发布版本中。

我仍然处于学习曲线的底部。我做错了吗,有没有更简单的方法,如果没有,是否有解决我的问题的方法?尽管有错误的VS版本,我能以某种方式获得较旧的VisualStudio DLL吗?

+0

更新一个*八年以前的版本的框架是一个简单易行的解决方案。在一家陷入困境的公司中努力创新是困难的,因为在这里你无法获得帮助。看看事业。 –

+0

修改以澄清对v2.0的需求是由于客户端的限制。我猜测问题不在于我的目标是_obsolete_.NET版本,而是我的目标版本早于安装的VS SDK的版本。 –

+0

一个想法;它有助于指定在模板指令中使用的C#版本吗? http://www.olegsych.com/2008/02/t4-template-directive/ – FuleSnabel

回答

2

创建两个组件。首先,针对.NET 2.0定义您描述的T4Attribute,然后针对.NET 4.0定义自定义TextTransformation。这样,您可以从产品代码和第二个程序集中引用第一个程序集,以实现代码生成目的。

+0

这是令人放心的 - 在被较早的反应所鼓舞后,我花了我的晚上尝试了这一点,并且迄今为止没有发现任何问题,除了一些NUnit和重复声明的复杂情况,但没有showstoppers。你的回答正好描述了我最终不得不使用的安排。我刚刚完成了对概念验证的测试,它运行完美,我同意这是最好的(也是唯一的)解决方法,可能会出现 - 谢谢! –

相关问题