2012-05-09 7 views
1

私のプロジェクトではResharperがインストールされています。私はVisual Studio内からT4テンプレートを使用してデザインタイムテンプレートを作成しています。VisualStudioのT4ジェネレータのパスからアセンブリを削除します

私は

<#@ assembly name="$(SolutionDIr)FTest\bin\Debug\FTest.dll" #> 
<#@ assembly name="$(SolutionDIr)FTest\bin\Debug\nunit.framework.dll" #> 

を持って、私はまた

<#@ import namespace="NUnit.Framework" #> 

は、私は、無効なキャスト例外を取得し、この

<# 
    var someVar = (TestAttribute)typeof(BaseTest).GetMethods() 
    .Where(
    x => x.GetCustomAttributes(false).Where(y => y.Name == "CategoryAttribute" && ((CategoryAttribute)y).Name == "Smoke").Any() 
    ) 
    #> 

イムのようなコードでキャストを持っています。テンプレートジェネレータは、プロジェクトdllが使用するdllとは異なる 'nunit.framework' dllを使用していることがわかります。 <#@インポート名前空間をインポートするとき

Error 21 Running transformation: System.InvalidCastException: [A]NUnit.Framework.CategoryAttribute cannot be cast to [B]NUnit.Framework.CategoryAttribute. Type A originates from 'nunit.framework, Version=2.5.10.11092, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77' in the context 'LoadFrom' at location 'C:\Users\Chandirasekar Thiaga\AppData\Local\assembly\dl3\ZGE1068O.OD1\ARWGXOXD.EMZ\7407d57d\ff3a4298_6ceccc01\nunit.framework.dll'. Type B originates from 'nunit.framework, Version=2.5.10.11092, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77' in the context 'Default' at location 'C:\Program Files (x86)\JetBrains\ReSharper\v6.1\Bin\nunit.framework.dll'. 

は、どのように私は、= "NUnit.Framework" #>はFTest.dllが使用するものと同じDLLをインポートしていますか?私はResharperのバージョンのnunitを使いたくない!

EDIT:

GarethJが言ったように、レジストリキーを設定した後、メッセージは次のようになります。

Error 12 Running transformation: System.InvalidCastException: [A]NUnit.Framework.CategoryAttribute cannot be cast to [B]NUnit.Framework.CategoryAttribute. Type A originates from 'nunit.framework, Version=2.5.10.11092, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77' in the context 'LoadFrom' at location 'C:\Repos\BSF-Functional-Automation\FunctionalTest\FunctionalTest\bin\Debug\nunit.framework.dll'. Type B originates from 'nunit.framework, Version=2.5.10.11092, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77' in the context 'Default' at location 'C:\Program Files (x86)\JetBrains\ReSharper\v6.1\Bin\nunit.framework.dll'. 
    at Microsoft.VisualStudio.TextTemplating64EAA000670725A96AF52252D093BE63.GeneratedTextTransformation.<TransformText>b__5(Object x) 
    at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source, Func`2 predicate) 
    at Microsoft.VisualStudio.TextTemplating64EAA000670725A96AF52252D093BE63.GeneratedTextTransformation.<TransformText>b__4(MethodInfo m) 
    at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext() 
    at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
    at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
    at Microsoft.VisualStudio.TextTemplating64EAA000670725A96AF52252D093BE63.GeneratedTextTransformation.TransformText() 
    at Microsoft.VisualStudio.TextTemplating.TransformationRunner.RunTransformation(TemplateProcessingSession session, String source, ITextTemplatingEngineHost host, String& result)  1 1 
+0

アセンブリキャッシングを一時的に無効にしてください。例外的にクリーナーデータを取得できますか。このshoudlはappdataのtempアセンブリのidrectoryを削除し、実際に比較している2つのアセンブリを見てみましょう。次にresharperのディレクトリが取り込まれる場所を見つけようとします。 HKEY_LOCAL_MACHINE \ SOFTWARE \ [Wow6432Node] \ Microsoft \ VisualStudio \ 10.0 \ TextTemplating 文字列値を設定します。ShadowCopy = false – GarethJ

+0

完了します。これでUncached DLLが表示されます。 – Zasz

答えて

2

@importはちょうど参照ではなく、「を使用して」ステートメントを貢献するので、それは必然的ではありませんここに。

LoadFromコンテキストにロードされるタイプAは、T4のアセンブリタグによってロードされているものです。 Resharperディレクトリから来たタイプBは、このエラーから、 'BaseTest'を含むアセンブリに対するリフレクションから来ているように見えます。

私は、Resharperがここでうんざりする可能性があるかどうかを確認するためにBaseTestのビルドを調べてみます。 basetestのアセンブリに対してリフレクターやildasmを実行することで、おそらくこの理論を検証できます。

+0

'((CategoryAttribute)y)'このセグメントでは、 'y'がタイプAであり、' CategoryAttribute'がタイプBで、私たちはAをBにキャストしようとしています。メッセージはタイプBがResharperのNunit私がそこにタイプしたテキスト 'CategoryAttribute'はResharperから来ており、変数' y'はBaseTestアセンブリから来ているということです。 – Zasz

+0

T4ファイルに 'OfType (C#ジェネリックス)または'(CategoryAttribute)y'というコードを入力し、BaseTestアセンブリに参照されるnunitも使用したいとします。しかし残念ながら、タイプ名を入力すると、間違ったアセンブリタイプが選択されます。私を助ける時間をとってくれてありがとう。 – Zasz

+0

テンプレートを使ってタイプを取得するリフレクションを使用して一時的に修正しましたが、タイプ名を手書きしないでください。 DLL(はい、BaseTestプロジェクトはresharper nunitを参照しません)、@assembly指令を使用して記述します。 – Zasz

関連する問題