T4"编译转换:已导入具有相同标识的程序集".尝试删除其中一个重复的引用."?

Mem*_*per 2 t4 templates code-generation visual-studio-2010

我一直在努力

编译转换:已导入具有相同标识"xxxx"的程序集.尝试删除其中一个重复的引用.

使用T4在设计时生成一些代码 - 将几个不同的可重用模板保存为.ttinclude文件,并在许多不同的"父"模板中共享.

我在这之间切换,当我删除其中一个引用(在我自己的ttinclude文件中)时,替换为:

编译转换:找不到类型或命名空间名称'yyy'(您是否缺少using指令或程序集引用?)

围绕圈子,任何想法?

Mem*_*per 5

好吧,找到一个肮脏的解决方法.

如果有人有建议,会喜欢更好的解决方案/方法吗?

发布我的过程可能对其他人有帮助.


  1. 使用模板指令将模板和包含模板放入调试模式,例如

    <#@ template language ="C#" debug ="true" hostspecific ="true"#>

  2. 在获得编译转换错误后,弹出打开%TEMP%以查看生成的文件(最近修改过的).

  3. 搜索使用的丢失/加倍装配/类别.发现哪些"包含"模板都具有相同的参考例如

    <#@ include file ="MyHelperTemplate.ttinclude"#>

    并且:

    <#@ include file ="EF.Utility.CS.ttinclude"#>

  4. 打开导致与我自己发生冲突的非自定义包含的include文件夹

    ..\Common7\IDE\Extensions\Microsoft\Entity Framework Tools\Templates\Includes

  5. 打开这个文件,删除了麻烦的导入

    <#@ import namespace ="EnvDTE"#>

  6. 使用相同文件夹中的新名称和更新的引用保存它以指向此新版本,例如

    <#@ include file ="EF.Utility.CS.Custom.ttinclude"#>

  7. 将所需的导入放入"父"模板,并从"包含"模板中删除.在我的情况下,这是:

    <#@ import namespace ="EnvDTE"#>


现在它运行正常,没有任何问题,没有重复的导入,并且正确引用了所有必需的程序集.

我确信有一种更复杂的方法来处理T4代码重用,完全否定了这个问题.我最初尝试导入我自己的自定义程序集,使用模板的帮助程序,但当我尝试构建自定义类库时,看起来像锁定dll的经典问题.

似乎T4 Toolbox有一个解决方案,使用VolatileAssembly自定义指令,并且很受欢迎,但对于我相当简单的需求看起来有点过分.也许当我有更多的时间.