2016-09-30 1 views
0

T4 템플릿을 만들었으며 템플릿 코드를 정리하는 데 도움이되는 몇 가지 도우미 클래스를 만들었습니다. 내 헬퍼 클래스에 대한 내 솔루션에서 새 클래스 프로젝트를 만들고 템플릿에서 어셈블리를 참조하고 네임 스페이스를 가져 왔습니다. 여기 T4 가져온 어셈블리에서 MissingMethodException이있는 T4 템플릿 오류가 발생했습니다.

은 예입니다

<#@ template debug="false" hostspecific="false" language="C#" #> 
<#@ assembly name="System.Core" #> 
<#@ assembly name="Microsoft.SqlServer.ConnectionInfo" #> 
<#@ assembly name="Microsoft.SqlServer.Smo" #> 
<#@ assembly name="Microsoft.SqlServer.SmoExtended" #> 
<#@ assembly name="$(SolutionDir)\MySolution.SqlMetaHelper\bin\Debug\MySolution.SqlMetaHelper .dll" #> 
<#@ import namespace="System.Linq" #> 
<#@ import namespace="System.Text" #> 
<#@ import namespace="System.Collections.Generic" #> 
<#@ import namespace="Microsoft.SqlServer.Management.Common" #> 
<#@ import namespace="Microsoft.SqlServer.Management.Smo" #> 
<#@ import namespace="MySolution.SqlMetaHelper" #> 
<#@ output extension=".txt" #> 
<# 
string @namespace = "MySolution.Data"; 
ServerConnection connection = new ServerConnection("localhost", "sa", "password"); 
Server server = new Server(connection); 
Database database = server.Databases["MySolution"]; 
#> 
namespace <#= @namespace #> 
{ 
<# 
foreach (Table table in database.Tables) 
{ 
#> 
    public interface I<#= table.Name #> 
    { 
     //Properties 
<# 
    foreach (ColumnMeta column in table.Columns.Cast<Column>().Select(c => new ColumnMeta(c))) 
    { 
#> 
     //<#=column.Name#> 
<# 
    } 
#> 
    } 
<# 
} 
#> 
} 

템플릿 실행이 실패하고이 오류를 반환 : 내가 성공하지 많은 것을 시도

Severity Code Description Project File Line Suppression State 
Error  Running transformation: System.MissingMethodException: Method not found: 'Void MySolution.SqlMetaHelper.ColumnMeta..ctor(Microsoft.SqlServer.Management.Smo.Column)'. 
    at Microsoft.VisualStudio.TextTemplatingE69FE551E9A42AE5D542A4EC2CDCECEDBDBC96F903EFDB8864E380652948850C270A5AC8C04E0B0F9368C0530BF3447DEAFC3716CC5CE03ABD37589675749A74.GeneratedTextTransformation.<>c.<TransformText>b__0_0(Column c) 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at Microsoft.VisualStudio.TextTemplatingE69FE551E9A42AE5D542A4EC2CDCECEDBDBC96F903EFDB8864E380652948850C270A5AC8C04E0B0F9368C0530BF3447DEAFC3716CC5CE03ABD37589675749A74.GeneratedTextTransformation.TransformText() MySolution.Data C:\Users\me\documents\visual studio 2015\Projects\MySolution\MySolution.Data\Entities.tt 1 

를하고 난 내 시나리오와 일치 아무것도 찾을 수 없습니다 웹에서. "Microsoft.SqlServer. ???"에 대한 참조와 관련이 있다는 느낌이 들었습니다. 어셈블리는 템플릿과 외부 라이브러리에서 모두 참조되며 다른 버전 일 수 있기 때문에이 문제를 어떻게 해결할 것인지 잘 모르겠습니다. 어떤 아이디어?

답변

0

헬퍼 클래스 프로젝트에서 같은 어셈블리를 참조하여이 문제를 해결할 수있었습니다.

나는 Microsoft.SqlServer를 확실히 만들었습니다. ??? 참조 로컬 복사 설정 한 다음이 같은 빌드 foler에 복사 된 어셈블리를 사용하는 T4 템플릿의 조립 부분 업데이트 된 : 프로젝트가 참조하는 어떤 어셈블리

<#@ assembly name="$(SolutionDir)\MySolution.SqlMetaHelper\bin\Debug\Microsoft.SqlServer.ConnectionInfo.dll" #> 
<#@ assembly name="$(SolutionDir)\MySolution.SqlMetaHelper\bin\Debug\Microsoft.SqlServer.Smo.dll" #> 
<#@ assembly name="$(SolutionDir)\MySolution.SqlMetaHelper\bin\Debug\MySolution.SqlMetaHelper.dll" #> 

GAC는 어셈블리의 버전이 일치하지 않은해야합니다 .