63

Webアプリケーションプロジェクトで参照されている外部DLLファイルがいくつかあります。ホスティングサーバーにインストールするための展開プロジェクトがあります。.NET3.5とVisualStudio2008を使用していたとき、DLLファイルはbinフォルダーにコピーされていました。.NET4とVisualStudio2010にアップグレードしたため、これは発生しなくなり、参照が見つからないためサーバーエラーが発生します。

CopyLocalがtrueに設定されており、web.config内に、これが他の場所で設定されていることを示唆するものが見つかりません。

4

15 に答える 15

105

Visual Studio 2010にはバグがあります。デフォルトでは、ソリューションファイルのXMLは次のようになります。

<Reference Include="DevExpress.SpellChecker.v11.1.Core,
           Version=11.1.5.0,
           Culture=neutral,
           PublicKeyToken=b88d1754d700e49a,
           processorArchitecture=MSIL">
<HintPath>..\References\DevExpress.SpellChecker.v11.1.Core.dll</HintPath>
</Reference>

MSBuildは以下でこれを期待しているのに対し、DLLファイルは展開に含まれます。

<Reference Include="DevExpress.SpellChecker.v11.1.Core,
           Version=11.1.5.0,
           Culture=neutral,
           PublicKeyToken=b88d1754d700e49a,
           processorArchitecture=MSIL">
<HintPath>..\References\DevExpress.SpellChecker.v11.1.Core.dll</HintPath>
<Private>True</Private>
</Reference>

秘訣は、に設定Copy LocalFalseプロジェクトを保存してから、リセットしてTrue-もう一度保存することです。これには、MSBuildが尊重するプライベートノードが正しく含まれます。

Copy LocalVisual Studio 2010に含まれていないプライベートノード()のデフォルトはであるように見えますがTrue、MSBuildはその欠落しているノードを。として読み取りますFalse

于 2011-11-21T15:14:01.327 に答える
3

同じ問題が発生し、「BeforeBuild」ステップを追加するのではなく、これを実行するテストを作成しました

    [TestMethod]
    public void ReferenceAssemblyThatDoesNotCopyToBuildFolder()
    {
        Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.LoggingExceptionHandler referenceThisButDoNotUseIt = null;
    }

そしてそれはエラーを修正しましたタイプ'Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.LoggingExceptionHandler...'は解決できません

于 2011-12-29T14:24:10.737 に答える
2

Something weird had happened to my deployment project. When I saw it had no detected dependencies, I removed the primary output and re-added it.

The dependencies are now showing up and being placed in the bin folder when installed.

于 2010-06-01T03:17:30.030 に答える
2

私はちょうど同じ問題を抱えていて、誰かを助けるかもしれないので私が見つけたものを共有したいと思いました:

私の場合の理由は、サードパーティアプリケーションのインストール中にアセンブリがGACにインストールされたためです。

DLLファイルがGACにある場合、Juntoが言及しているように、プロジェクトファイルの「Private」ノードを使用して「copylocal」として特にマークしない限り、コンパイラはそれを宛先フォルダにコピーする必要はありません。

そのノードを追加せず、あるマシンで開発して別のマシンでビルドし、DLLファイルがビルドマシンのGACにのみ存在する場合、プライベートノードがないデフォルトの動作により、ファイルは開発マシンに正しくコピーされますが、ビルドマシンにはコピーされません。

より大きな問題は、DLLファイルが直接参照されていないが、プロジェクトが2番目のプロジェクトを参照していて、そのプロジェクトがDLLファイルを参照している場合です。その場合、DLLファイルは参照されていないため、プロジェクトで「ローカルコピー」としてマークすることはできません。したがって、DLLファイルがGACに存在する場合、出力フォルダーにはコピーされません。

この場合の可能な解決策は次のとおりです。

  • GACからDLLファイルをアンインストールします
  • エンドプロジェクトのDLLファイルへの直接参照を追加します
  • 新しい厳密な名前でDLLファイルに再署名します。これにより、GACのDLLファイルと区別されます。
于 2015-05-31T17:00:44.863 に答える
1

私はまったく同じ問題を抱えていました。EnterpriseLibraryを参照するVisualStudio2008プロジェクトがあります。TFSとWebデプロイメントプロジェクトを使用して統合ビルドを実行すると、すべてのDLLファイルがコピーされます。Visual Studio 2010、TFS 2010、およびWDP 2010にアップグレードしたときに、DLLファイルの一部が欠落していました。不思議なことに、これは一部のDLLファイルでのみ発生し、他のファイルでは発生しません。

たとえば、どちらの場合もMicrosoft.Practices.EnterpriseLibrary.ExceptionHandling.dllはコピーされますが、Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.dllはコピーされません。

回避策として、「BeforeBuild」ステップを使用してファイルをコピーしました。

今では問題なく構築されているようです。

于 2010-08-06T09:23:08.817 に答える
0

Visual Studio 2008でどのように設定されたかはわかりませんが、ビルド後のイベントコマンドラインを使用している可能性があることはほぼ間違いありません。そこで、展開に必要なDLLファイルをコピーするように指示できます。以下に例を示します。

mkdir $(SolutionDir)\Deployment
copy "$(SolutionDir)Your_Library_Name\Your_Dll_ForDeployement.dll" 
$(SolutionDir)\Deployment\
于 2010-06-01T02:46:13.880 に答える
0

私は同じ問題に遭遇しませんでしたが、似ています。WPFメインプロジェクトと参照プロジェクトがあり、参照がコピーされませんでした。私の場合、メインプロジェクトはNET 4.0クライアントプロファイル用に設定されており、NET3.5用に参照されていることがわかりました。メインプロジェクトを3.5に設定すると、参照されているプロジェクトのコンパイル済みdllのコピーが開始されました。(練習で解決したので理由はわかりません)

于 2013-04-24T20:06:30.567 に答える
0

を使用し<Private>False</Private>て、参照されているDLLファイルをbinディレクトリにコピーしないようにすることができます。binこれは、DLLファイルをディレクトリにコピーするのではなく、アプリケーションをビルドする必要がある別のTFSビルドサーバーでアプリケーションをビルドする場合に役立ちます。

于 2013-12-10T13:49:13.487 に答える
0

DLLファイルが参照されているプロジェクトのフレームワークを確認してください。フレームワークは.NET4.0である必要があります。フレームワークがクラ​​イアントプロファイルの場合は修正してください。

于 2014-08-28T18:34:29.070 に答える
0

私も同様の問題に遭遇し、参照されたdllが公開フォルダーのbinにコピーされませんでした。binフォルダーがアプリケーションに含まれていないTFSチェックアウトコピーを使用していました。->つまり、binフォルダーを含めただけです。->参照されたアプリケーションを構築しました->Webサイトプロジェクトを公開しましたこれで、公開されたフォルダーのbinにあるすべての参照されたdllが表示されます

于 2015-05-06T06:01:16.390 に答える
0

VS2012Expressでも同様の問題が発生しました。プロジェクトではTesseractライブラリを使用しました。複数のプロジェクトがあるソリューションでこのプロジェクトを使用するまで、すべてがうまく機能しました。問題は、通常はbin / debug/x86またはbin/debug / x64フォルダーに配置されている一部のDLL(liblept168.dll、libtesseract302.dll)が、ソリューション全体を再構築したときにのみコピーされることでした。1行を変更して再構築すると、DLLが削除され、コピーされませんでした。

不足しているDLLを作成するプロジェクトの参照をスタートアッププロジェクトに追加することで、この問題を解決しました。

于 2016-02-05T08:59:03.817 に答える
0

rzenと他の人、ありがとう-あなたのコメントは私たちのための解決策につながりました。

Microsoft.ReportViewer.Common.dllおよびMicrosoft.ReportViewer.WebForms.dllアセンブリのバージョン10を対象とするプロジェクトがあります(「src」レベルで作成した個別の「libs」フォルダー)。しかし、ビルドを行ったとき、出力にはバージョン12が含まれていました。これは、最近ビルドサーバーにインストールされました。

ここでコメントを使用して、「ローカルコピー」がTrueに設定され、フラグがプロジェクトファイルに設定されていることを確認しました。ただし、バージョン12はまだデプロイされていました。そのため、トリックを実行したのは、2つの参照に「特定のバージョン」プロパティも設定されていることを確認することでした。出来上がり、各ファイルのバージョン10がデプロイされています!

たくさんの喜びがありました。

JH

于 2016-04-29T15:02:24.370 に答える
0

プロジェクトがライブラリを直接ロードしない場合、明示的に参照されていても、常にデプロイされるとは限りません。ローカルのBinディレクトリに表示されたが、デプロイされたときは表示されなかったため、混乱しました。Binディレクトリのdllは、クリーン中に削除されなかった古いファイルでした。そのため、私は混乱しました。

完全にクリーンアップして再構築しましたが、ローカルのBinフォルダーにも問題がなかったため、問題が発生しました(web.configでのみ使用しています)。次に、プロジェクト内のdllファイル自体を参照し、それを出力にコピーするように設定して、確実にデプロイされるようにしました。

于 2016-10-14T13:52:58.653 に答える
0

パラメータの追加

/ deployonbuild = false

msbuildコマンドラインで問題を修正しました。

于 2019-11-27T16:45:23.183 に答える
0

古いWebサイトをWebアプリケーションにアップグレードするときに同様の問題が発生しました。「CleanSolution」コマンドは、binフォルダーに意図的に残したすべての外部DLLファイルを消去します。

さらに、それらの多くは同じファイル名を持っているため、それらすべてを参照するだけでそれらのDLLを自動的に戻すことはできませんでした(多くの言語固有のリソースを使用する場合に発生します)

stevie_cが行ったように、私はPre-Buildコマンドを利用しましたが、それをより簡単にしました:

WebApplicationプロジェクトのプロパティのビルド前の操作でxcopyコマンドを使用しました。このようにして、ビルドが開始される直前に必要な外部DLLファイルを取り込むことができました。

于 2021-11-19T22:37:26.177 に答える