2012-02-26 10 views
14

新しいMSBuildインラインタスクを使用して、Microsoft.Web.Publishing.Tasks.dllアセンブリのTransformXml(XDT変換)を活用しています。MSBuildインラインタスク - 非標準Microsoftアセンブリの参照

<Task> 
    <Reference Include="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/> 
    <Reference Include="System.Xml" /> 
    <Using Namespace="System"/> 
    <Using Namespace="System.Linq"/> 
    <Using Namespace="System.IO" /> 
    <Using Namespace="System.Xml"/> 
    <Using Namespace="Microsoft.Web.Publishing.Tasks"/> 
    <Code Type="Fragment" Language="cs">...</Code> 
</Task> 

これは罰金コンパイルし、あるのappBaseパスにアセンブリを見つけようとしているので、それが失敗し、実行時にDLLが、しかし、ロードされます。ここでは

は私の仕事(切り取ら)は次のようになります。 :C:\Windows\Microsoft.NET\Framework\v4.0.30319。私はそれが私が与えた道を見ることを期待していたでしょう。

フュージョンログには、このことを示しています

=== Pre-bind state information ===\r 
    LOG: User = xxx\Kamran\r 
    LOG: DisplayName = Microsoft.Web.Publishing.Tasks, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 
    (Fully-specified)\r 
    LOG: Appbase = file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/\r 
    LOG: Initial PrivatePath = NULL\r 
    Calling assembly : (Unknown).\r 
    ===\r 
    LOG: This bind starts in default load context.\r 
    LOG: Using application configuration file: C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe.Config\r 
    error MSB4018: LOG: Using host configuration file: \r 
    error MSB4018: LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.\r 
    error MSB4018: LOG: Post-policy reference: Microsoft.Web.Publishing.Tasks, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\r 
    error MSB4018: LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/Microsoft.Web.Publishing.Tasks.DLL.\r 
    error MSB4018: LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/Microsoft.Web.Publishing.Tasks/Microsoft.Web.Publishing.Tasks.DLL.\r 
    error MSB4018: LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/Microsoft.Web.Publishing.Tasks.EXE.\r 
    error MSB4018: LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/Microsoft.Web.Publishing.Tasks/Microsoft.Web.Publishing.Tasks.EXE.\r 

は、この問題を解決する方法はありますか私は、代わりに、タスクアセンブリを作成することを余儀なくされるのですか?

+0

[MSBuild:インラインタスク参照に使用されるパスが正しくありません](https://connect.microsoft.com/VisualStudio/feedback/details/768289/msbuild-path-used-for-インライン・タスク参照は非公式です)。再提出:[MSBuild:インラインタスク参照に使用されるパスが尊重されません](https://connect.microsoft.com/VisualStudio/feedback/details/2285231) – Stijn

+0

このバグはMicrosoftによって再現されました。 https://github.com/Microsoft/msbuild/issues/594で進捗状況を確認できます。 – Stijn

答えて

3

私はまだこれに本当の答えが欲しいですが、反射を使用してアセンブリをロードするだけでこの問題を回避できました。

フルソースin my gistが表示されます。

0

Dzoneで、この記事によると:Web.config transformationsあなただけのMSBuildファイルの先頭に

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/> 

を追加する必要があります。 MSBuildがそれを見つけず、GACからロードしようとしているようです。

0

もう1つの回避策は、AppDomain.AssemblyResolveを使用しています。ただし、フレームワークでアセンブリが必要になる前に、ハンドラを登録する必要があります。

これは、フラグメント内にアクションデリゲートのすべてを配置することで実行できます。別の可能性は、 'Code'要素の 'Type'属性を 'fragment'ではなく 'class'に設定することです。

AssemblyResolveの使用については、既にstackoverflowに関する記事があります:How to add folder to assembly search path at runtime in .NET?

まだ理想的ではありませんが、私の場合は反射よりもきれいです。

関連する問題