2010-08-08 7 views
30

J'ai le code suivant dans une classe de testeur dans mon assembly principal, PocoGenerator. Cet assembly est supposé utiliser un template T4 pour générer des POCO basés sur des entités L2S dans un assembly référencé (une référence de projet), DataObjects.Impossible de référencer un assemblage dans un modèle T4

var assemblyName = "DataObjects"; 
var dataObjects = AppDomain.CurrentDomain.Load(new AssemblyName(assemblyName)); 

Essayez comme je peux, je ne peux pas obtenir T4 pour trouver l'assembly DataObjects. J'ai essayé diverses formes de assembly directives, comme:

<#@ assembly name="DataObjects" #> 
<#@ assembly name="DataObjects, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" #> 

en vain. Le code ci-dessus fonctionne dans la classe testeur, mais pas dans le modèle. Qu'est-ce que je fais mal?

AJOUTÉE: J'ai résolu ce problème en utilisant le chemin absolu à l'assemblée dans les lieux de bots je font référence, la directive ainsi que le bloc de fonctionnalité de classe, à savoir

<#@ assembly name="C:\Development\PocoGenerator\DataObjects\bin\Debug\DataObjects.dll" #> 

et

var sourceAssembly = Assembly.LoadFile(@"C:\Development\PocoGenerator\DataObjects\bin\Debug\DataObjects.dll"); 

Mais je n'aime vraiment pas cela, car je voudrais utiliser ce modèle dans divers projets, et je déteste tout simplement la duplication, en particulier des chaînes magiques.

+0

Votre projet de modèle devrait avoir une référence de projet au projet que vous avez une dépendance. Votre tag "assembly" ci-dessus semble correct. Et vous devriez également avoir une référence "import". Quel message d'erreur exact obtenez-vous? (et ce qui est avec les choses AppDomain? vous ne devriez pas avoir à faire quelque chose comme ça) –

+0

Le truc AppDomain est tp permettez-moi d'itérer tous les types dans l'un des assemblys chargés dans l'AppDomain actuel. Cela n'a rien à voir avec le référencement de l'assemblage pour le modèle lui-même. – ProfK

+0

Oui, je vois maintenant. Et quel message d'erreur exact recevez-vous? –

Répondre

54
<#@ assembly name="$(ProjectDir)bin\Debug\ProofOfConcept.dll" #> 

Bonne programmation!

+1

Notez bien qu'il s'agit d'une fonctionnalité uniquement VS2010 – GarethJ

+30

Ou mieux encore: '<# @ assembly name =" $ (ProjectDir) $ (OutDir) $ (TargetFileName) "#>' –

+13

Simplest: '<# @ Nom de l'assembly =" $ (TargetPath) "#>' – pylover

1

J'ai eu un problème similaire lorsque j'ai essayé d'inclure Less Css for .NET dans mon projet Web.

J'ai fini par copier l'assemblage dans le dossier racine de mon projet et l'inclure comme référence dans le projet lui-même. Ensuite, je l'ai ajouté les lignes dans le fichier .tt suivants:

<#@ assembly name="dotless.Core.dll" #> 

<#@ import namespace="dotless.Core" #> 
<#@ import namespace="dotless.Core.configuration" #> 

Je suis sûr que quelque chose de similaire devrait fonctionner avec votre assemblée et ...

0

J'y ai trouvé sont un nombre de cas dans la création et l'utilisation de la boîte à outils et des paquets gax où la construction est parfaitement satisfaite de la façon dont les références sont structurées mais le moteur d'exécution est dérangé parce qu'il ne trouve pas ce qu'il cherche. assembly qui utilise des éléments gax puis cet assembly référence à son tour un autre assembly que le principal ne fait pas. Essayez d'inclure directement l'assembly en question dans votre assembly principal - et considérez que vous devrez peut-être écrire des instructions de post-construction pour le déplacer vers un emplacement 'attendu' - alors que vous devriez avoir à câbler le chemin.

YMMV

14

Pour référencer l'ensemble dans le modèle T4 dans VS2010 vous avez quelques options:

  1. GAC vos assemblages et utilisez Espace de noms de référence ou de type entièrement qualifié Nom
  2. Utiliser un disque codé Fully Qualified chemin UNC
  3. Copiez l'assembly dans Visual Studio "Public Assemblies Folder" et utilisez Namespace Reference ou Fully Qualified Type Name.
  4. Utilisez ou définissez une variable d'environnement Windows pour créer un chemin UNC entièrement qualifié.
  5. Utilisez une macro Visual Studio pour créer un chemin UNC entièrement qualifié.

Je suggère que vous mettez un ensemble référencé dans vos assemblées des dossiers publics, une autre, peut-être même meilleure solution serait de coder en dur le chemin de vos ensembles référencés.

Très belle post sur ce sujet: T4 Template error - Assembly Directive cannot locate referenced assembly in Visual Studio 2010 project.

Fondamentalement, MS a décidé de le changement de freinage, que le projet ensembles référencés ne sont pas référencées par le moteur T4, aussi.

Le jeu d'assemblage de T4 est complètement séparé du jeu d'assemblage du projet conteneur pour éviter de détecter les mauvais assemblages lorsqu'un projet cible des versions précédentes du framework. Les assemblys de projet ne sont plus utilisés pour résoudre les directives d'assemblage de modèles.

Plus sur ce point: What's new in T4 in Visual Studio 2010

+0

+1 pour que la référence du projet ne soit plus utilisée, ça me tue! – dbones

+0

@Peter Stegnar Je pose une question connexe ici: http://stackoverflow.com/questions/13838142/put-all-methods-in-one-tt-file-and-use-it-in-another-t4-files -in-codetemplates pourriez-vous s'il vous plaît vérifier – Saeid