2013-06-06 18 views
37

Witam Muszę dodać zespół istniejącego projektu w moim rozwiązaniu w moim pliku szablonu T4. Problem polega na tym, że mój szablon T4 znajduje się w projekcie o nazwie Project.WebApi, a klasa, której potrzebuję w moim szablonie T4, znajduje się wewnątrz projektu o nazwie Project.Common.WebApi.Szablon T4 dodawanie zespołu istniejącego projektu w roztworze

mam Bogate importowania nazw takiego:

<#@ import namespace="Project.Common.WebApi.T4TemplateAttribute" #> 

Ale otrzymuję ten błąd:

The type or namespace name 'Project' could not be found (are you missing a using directive or an assembly reference?) 

Mam tryed dodając zespół tak:

<#@ assembly name="Project.Common.WebApi" #> 

I Mam ten błąd:

Compiling transformation: Metadata file 'Project.Common.WebApi' could not be found 

Mój projekt zawierający T4Template (Project.WebApi) ma odniesienie do Project.Common.WebApi, ale z tego co przeczytałem T4Template nie korzysta z odniesień w projektach.

Jak mogę rozwiązać ten problem?

Odpowiedz

60

T4 działa prawie całkowicie niezależnie od reszty kodu. Jesteś na dobrej drodze, z dyrektywą assembly, ale musisz podać pełną ścieżkę do rzeczywistej biblioteki DLL złożenia, chyba że zestaw jest w GAC (co prawdopodobnie nie jest).

Na szczęście można jednak użyć makr MSBuild w dyrektywach T4. Tak, prawdopodobnie będziesz dostać coś takiego

<#@ assembly name="$(SolutionDir)Project.Common.WebApi\bin\Debug\Project.Common.WebApi.dll" #> 

Zobacz MSDN jakiegoś tła więcej na tej składni.

Nadal potrzebujesz również dyrektywy import namespace.

Wreszcie należy uważać na kolejność budowania projektu. Projekt, który zawiera twój szablon T4, teraz zależy od Project.Common.WebApi, więc musisz się upewnić, że Project.Common.WebApi jest zbudowany jako pierwszy. W przeciwnym razie twój szablon T4 może przypadkowo połączyć się ze starszą wersją zespołu, co sprawia, że ​​błędy są naprawdę trudne do śledzenia.

Jeśli masz już odniesienie do projektu, wszystko gotowe, ale w przeciwnym razie musisz poprawnie skonfigurować zależności. Możesz to zrobić w Visual Studio za pomocą okna dialogowego "Project Dependencies ...". Kliknij projekt prawym przyciskiem myszy, aby go znaleźć.

+2

Powinien to być '$ (SolutionDir) Projekt ...' zamiast '$ (SolutionDir) \ Project ...' ponieważ '$ (SolutionDir)' już dołącza końcowy ukośnik odwrotny. – CallMeLaNN

+0

Dobra! Edytowano odpowiedź. Dzięki! – skrebbel

+3

również powinno być $ (ConfigurationName) zamiast Debugowania – Nahum

19

W przypadku, gdy projekt z szablonu T4 ma bezpośrednie odniesienie do projektu, można użyć $ (TARGETDIR)

< # @ montażu name = "$ (TARGETDIR) Project.Common.WebApi.dll "#>

+0

To rozwiązanie sprawdziło się. T4 i DLL muszą być w tym samym projekcie lub projekt zawierający T4 odwołuje się do projektu DLL, więc jest kopiowany. – Andrea

+0

fajnie, działało idealnie –

1

Tylko w przypadku, gdy zostały przy użyciu C#

myślę byłoby:

<#@ assembly name="$(SolutionDir)Project.Common.WebApi\\bin\\Debug\\Project.Common.WebApi.dll" #> 

Użyj podwójnego ukośnika.

14
<#@ assembly name="$(TargetPath)" #> 

Takie proste.

+0

Dobre, krótkie rozwiązanie! –

+0

To znacznie prostsze, do roboty :) – Bartosz

Powiązane problemy