2009-05-01 32 views
16

VS(この場合は2008)でWebアプリケーションプロジェクトへの参照を追加すると、csprojファイルの「ヒントパス」が相対参照として作成されています。これを絶対参照(C:\ Temp \ DllName.dll)にする方法はありますか(GUIを使用し、手動でファイルを編集しないでください)?Visual Studioを使用して参照を絶対的に強制する

私が問題になっているのは、別個のビルドマシンがプロジェクト用に異なる作業ディレクトリを持っている場合です。参照が相対的で、参照されるdllがプロジェクトの作業ディレクトリ内にない場合、相対参照は両方のコンピュータ上の同じ場所を指していない可能性があります。

+1

非相対パスを使用する目的は何ですか?私はSpecialFolderを含むパスが必要だと理解できますが、完全にハードコーディングされたパスはシステム間で柔軟性がありません。 – STW

+2

@ Yoooderあなたは、スタジオが好きな陽気な相対的な経路を見ていない、それはハードコードされているかもしれません。私はそれらを見たことがあります.. \ .. \自分自身がすべてルートになってからターゲットフォルダに戻ってしまいました。 – hova

+0

私はこれを探していました。どうして?私は長年にわたり、さまざまなバージョンのアプリケーションの変更を壊すことから回復するいくつかの拡張メソッドを持っています。 AutoDeskありがとうございました。待って、いいえ。これらの拡張メソッドはすべての私のアプリで普遍的です。 AutoCADの矛盾を修正したり変更したりする必要があるため、私のマシン上のすべてのアプリケーションにパッチを適用する必要はありません。私は1つの場所でそれを修正したい。これを行う唯一の他の元気な方法は、ローカルNugetサーバーを使用することです。大過剰ですか? –

答えて

-1

私はお手伝いしたいと思いますが、なぜこれが必要ですか? 2003年のvnetのベータ版以来、私は決してこれをやらなければなりませんでした。私はここでさらに深い疑問があると思います。

あなたは、プロジェクトのプロパティ

+0

通常、これは、他の誰かが最初に作成したものとは異なるパスの深さで、ソリューションにプロジェクトを読み込むときに発生します。 – hova

+2

私は数年にわたって.netのチームを率いてきました。あなたはこのように#@#$ナットに行くでしょう。これが私が最初に修正したものです。誰もが弾を噛んで、あなたのソリューションプロジェクトを整理して、誰かのビープ音を止めて、そのビープ音を聞いてください。 – Gary

+0

それでは、あなたはこれを一度もやらなかった理由を説明します。 – hova

0

で参照パスのページを試すことができなければならない場合は、右プロジェクトのプロパティ]をクリックし、[参照パスに行くと、そこにハードコーディングされたパスを追加してみてください。

+1

私はこれを行いましたが、実際に.csprojファイル内の何かを変更するようには見えません。だから、これは各dev/buildマシンに追加する必要はありませんか? – Jeremy

5

デフォルトでは、参照が最初に追加されたときにVisual Studioは相対参照を使用します。これは、参照が作業コピーの別の場所にあるとみなしているためです。

これは、ナット私を駆動するために使用されるが、私は3つの異なる方法でそれを解決:ドライブが保存することができませんでした:のDLLがCで参照することを意味し、ドライブ:私のDに私のソースコードを維持することによって

  1. 相対パスで
  2. パワーを説得することで、すべてのデベロッパーワークステーションに単一のイメージ/スクリプトを使用することができます。これですべてが同じになりました。ファイルはすべてC:ドライブの同じ場所にあります。
  3. AssemblyFolders registry keyにフォルダを追加できることを認識することで、既知のアセンブリを参照するためにどのような種類のパスも使用する必要がなくなりました。
+1

ヤール、それを別のドライブに入れたり、別のドライブにマッピングしたものがこれを倒す唯一の方法のようです。 –

+0

3のリンクが壊れています....これはこれですか? http://stackoverflow.com/a/238445/1507899 – RJB

+0

十分に近い、はい。 –

5

これを行うための唯一の方法は、参照を追加した後に手動でcsprojファイルを編集することです。

<Reference Include="foo, Version=1.2.3.4, Culture=neutral, ..."> 
    <SpecificVersion>False</SpecificVersion> 
    <HintPath>C:\absolute\path\foo.dll</HintPath> 
</Reference> 

とはい、私は絶対パス、それが作成するすべての自動配信の狂気を憎むが、この場合には、私は「インストール」する必要があるCOM DLLを使用する.NETラッパーを参照して物事を行う必要がありますレジストリへのアクセスなど、絶対パスは唯一の方法です。

10

これは古い質問ですが、それでも関連しています。私は、サードパーティ製のソフトウェアのグローバルリポジトリからアセンブリを参照する方法を解決するために探し求めている間、それを見つけました。

現時点での私のアプローチは、thinkOfaNumberの回答と似ています。ハードコードされた絶対パスを使用する代わりに、.csprojファイルに環境変数を埋め込むことをお勧めします。環境変数は絶対パスを保持します。例:

<Reference Include="Foo"> 
    <HintPath>$(THIRDPARTY_ROOT)\foo\3.1.0\bin\foo.dll</HintPath> 
</Reference> 

この追加レベルの間接指定は、異なるビルドマシン(開発システムとビルドサーバーなど)で異なるパスを使用できる柔軟性を提供します。

ただし、これを行うには手動で.csprojファイルを編集する必要があります。

+0

はい、あなたの答えは真にポイントに達するものです。パスが何であるかを誰が呼び出しようとしているのか、相対パスか絶対パスかが最善のものかどうかは愚かです。現実には、すべての開発者が同じ設定をしているかどうか(NOT!)をアサートできるかどうかにかかわらず、ビルドサーバー自体は異なる設定になる可能性があります。あなたのヒントのパスで変数を使用しない場合、非常に洗練されたやり方でこれをやっていないだけです。つまり、このデータを保持するためにプロジェクト変数や環境変数を定義できるようにする必要があります。 – paulyphonic

+1

マイクロソフトでは、複数のHintPath要素を許可して、一致が検出されるまで繰り返すようにしてください。実際には、私は「ヒント」という言葉に基づいていると考えていました(もしあなたが誰かにヒントを与え、それが助けになれない場合、おそらく別のヒントを与えるべきです... "ヒントヒント")。多くのトラブルシューティングで見つかったのは、見つかった最後のHintPath要素だけを気にするということです。 – paulyphonic

+4

VSは '.suo'ファイル内の参照されたアセンブリへのパスをキャッシュすることに注意してください。したがって、THIRDPARTY_ROOT環境変数の値を変更する場合は、ソリューションを閉じて '.suo'ファイルを削除してから、ソリューションを再度開いてください。 – SergeyT

0

この問題も発生しました。絶対パスを使用したかったのは、各デプロイメントでPackagesフォルダが別々の場所に作成された(複数のビルドマシンもあるため)。そのアイデアは、1つの場所にNuGetパッケージを置くことでした。これは、無駄なメモリが同じものの複数のコピーを持たないようにします。

私たちの具体的な問題は、NuGet.Configファイルに絶対パスを設定できることでした.NuGetパッケージは展開時にその場所に復元されますが、MSBuildのステップではすべて見つかりませんでした。同じ展開。

この問題を解決するためのPowerShellスクリプトを作成しました。基本的には、相対パスのHintPath参照を、使用したい絶対パスに置き換えます。

#Get list of all csproj files in a solution 
$dir = Get-ChildItem $pwd -Recurse 
$list = $dir | Where {$_.extension -eq ".csproj"} 

#Replace relative paths with absolute path 
$absolutePath = 'C:\absolute\path\Packages' 
function replaceRelativePath($line){ 
    if($line -match '<HintPath>[^C].+\\Packages') 
    { 
     $relative = $matches[0] -replace '\\','\\' 
     return ($line -replace "$relative", "<HintPath>$absolutePath") 
    } 
    else 
    { 
     return $line 
    } 
} 

#Updating files 
Foreach($file in $List) 
{ 
    (Get-Content $file.FullName)| ForEach-Object{replaceRelativePath($_)} | Set-Content $file.FullName 
} 

このスクリプトは、展開時にMSBuildが実行される前にPowerShellビルドステップとして実行するように設定しました。その結果、csprojファイルはビルドマシン上の作業ディレクトリに対して変更されますが、Visual Studioソース管理では変更されません。 (ソース管理で変更したい場合は、おそらくこれをPowerShellで実行して変更をチェックすることができます)。

関連する問題