2013-10-14 1 views
3

J'essaie d'utiliser le modèle T4 pour générer automatiquement de l'utilisation de code dans mon projet. J'ai commencé petit pour me mouiller les pieds et c'est ce que j'ai jusqu'ici.Comment puis-je référencer des classes dans un modèle de texte T4 qui existe déjà dans le projet en cours?

<#@ template debug="false" hostspecific="true" language="C#" #> 
<#@ output extension=".cs" #> 
<#@ assembly name="C:\Users\username\Documents\Visual Studio 2012\Projects\MyProjectSolution\MyProject\bin\Debug\MyProject.exe" #> 
namespace KY_ADJRATE_CLAIM 
{ 
    public class OutboundClaim 
    { 
<# 
    ClaimConfig cc; 
#> 
    } 
} 

J'ai essayé ce

<#@ assembly name="C:\Users\username\Documents\Visual Studio 2012\Projects\MyProjectSolution\MyProject\bin\Debug\MyProject.exe" #> 

et ce

<#@ assembly name="MyProject.exe" #> 

Mais chaque fois que je tente de créer une instance d'une de mes classes, je reçois ceci:

Un espace de noms ne peut pas contenir directement des membres tels que des champs ou des méthodes. Transformation de compilation: Le type ou le nom d'espace de noms 'ClaimConfig' est introuvable (une directive using ou une référence d'assembly est-elle manquante?)

Ce que je veux faire, c'est accéder à la classe ClaimConfig dans mon projet via un template T4 .

Toute aide serait grandement appréciée.

Répondre

4

Je suggère fortement que vous séparez toutes les classes communes (ce qui est, des classes qui seront utilisés dans le T4 et T4 à l'extérieur) dans un ensemble commun, qui peuvent ensuite être référencés par votre projet et vos modèles T4:

MySolution 
| 
| -> MyProject.Common 
| |--> ClaimConfig.cs 
| 
| -> MyProject.Main 
| |--> References 
| | |--> MyProject.Common 
| | MyT4Template.tt 

Afin que la compilation de MyProject.Common (qui contient toutes les classes nécessaires pour compiler avec succès le projet principal et les modèles T4) est séparée.

Ensuite, dans votre modèle:

<#@ assembly name="C:\Users\username\Documents\Visual Studio 2012\Projects\MyProjectSolution\MyProject.Common\bin\Debug\MyProject.Common.dll" #> 

Aussi, je vous suggère fortement d'utiliser un éditeur T4, comme Tangible T4 Editor, il va vous aider beaucoup lors de l'édition des modèles T4, principalement parce qu'il met clairement en évidence et marques une différence visuelle entre le "code résultant" (IE la sortie du modèle) et le "code générateur" (le code à l'intérieur du modèle). Ils fournissent une version gratuite, ainsi qu'une version commerciale complète. J'utilise la version gratuite et cela a été très utile jusqu'ici.

5

Ceci est similaire à une autre question que j'ai vu dans le passé (How do I use custom library/project in T4 text template?). Vous devez référencer la DLL en utilisant la directive "assembly". Par exemple:

<#@ assembly name=“System.Xml” #> 

Pour référencer une DLL à partir de votre propre projet ou d'une solution, vous pouvez utiliser un chemin relatif, mais d'abord vous devrez définir l'attribut HostSpecific dans la directive « modèle » comme celui-ci:

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

Vous pouvez ensuite utiliser le $ (SolutionDir) macro pour obtenir la racine de la solution, et la construction d'un chemin relatif à la DLL à partir de là, comme ceci:

<#@ assembly name="$(SolutionDir)\MyOtherProject\bin\Debug\MyOtherAssembly.dll” #> 
Questions connexes