問題タブ [assembly-resolution]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - トラブルシューティング:Wordコードビハインドを介してカスタムコードを呼び出すときに、参照されているアンマネージdllが見つかりません
コンテクスト:
- D:\ WordAutomation \ MyApp_Source \ Executables\MyAppフォルダーに特定のアンマネージDLLを使用するWPFアプリがあります。exeをダブルクリックすると、すべてが実行されます。
- 次に、Word 2007の分離コードプロジェクトがあります。このプロジェクトは、上記のフォルダー内の関連するマネージDLLを参照し、同じことを実行しようとします。アプリUIを起動します。適切な「マチェット」の後、UIが表示されます。しかし、現在、FileNotFoundExceptionで一貫して爆発するアンマネージdllの1つを強制的にロードするユーザーアクションがあります(どのファイルが欠落しているかのヘルプ/表示はありません)
問題のある行にブレークポイントを設定し、出力ウィンドウをクリアし、F10キーを押して、その行を実行したときの出力を比較しました(ObservableCollectionにオブジェクトを追加します。そのCollectionChangedハンドラーには、管理されていない部分をロードするコードがあります)
ケース1:EXEをダブルクリックします。これは完全に機能します(わずかに切り取られています)
ケース2:同じ行を実行しますが、Wordコードビハインド.csファイル内から起動します
私が試してみました
- アンマネージDLLを(word doc + VSTO dll)と同じフォルダーに追加する
- フォルダをPATH環境変数に追加しました。まだ同じ。
- 私が考えることができるものは何でも..過去数日間
以下のスニペットに示すように、Wordがマネージドrefアセンブリをコピーしているように見えます。これは調査の行である可能性があります。しかし、なぜこれを行うのか、そしてそれがアンマネージDLLをどのように解決するのか..わかりません。また、最初のスニペットには、WinSXSパスからロードされたDLLがいくつかあり、これも別のリードになる可能性があります。
最後に優雅に締めくくります...助けて!
.net - トラブルシューティング: MS-Word VSTO アドインからのマネージ DLL のアセンブリ解決
という名前のコード ビハインド dll を含む MS-Word VSTO ドキュメントがあります。WordDocument1.dll
プロジェクト フォルダー D:\Work\Seven\WordAutomation\ContentControls\WordDocument1\bin\Debugその下のフォルダー
にいくつかのカスタム コードをコピーしました。MyAppExecs
DLL には、コード内のコードにMyAppExecs
到達できるように指定されたプライベート ビン パスがあります。
そのため、起動時に、ダイアログをポップアップするフォルダーStarter.DLL
にロードします。MyAppExecs
ただし、ダイアログのボタンをクリックすると、X.DLL
管理されていない依存関係を持つ をロードする必要があります。(X.DLL
マネージ C++ がいくつかあり、追加の依存関係として指定されたライブラリがいくつかあります。X は署名されておらず、プライベート アセンブリであり、GAC ではありません)
ただし、X.DLL は解決できません。fuslogvw
ツールから、この DLL を Office12 フォルダーにロードしようとして失敗していることがわかります。私もProcMon
実行していますが、管理されていない依存ファイルが見つからないというエラーは表示されません。
- に存在する X.Dll を Word Executable に表示させるにはどうすればよい
D: \Work\Seven\WordAutomation\ContentControls\WordDocument1\bin\Debug
ですか?
Starter.DLL
また、 で問題なくロードできる{ProjFolder}\MyAppExecs
のに、 でファイルが表示されないのは奇妙に思えます{ProjFolder}
。
fuslogvw
出力は次のとおりです。
Update#1 : 症状は解決しましたが、問題の原因を特定できませんでした。Assembly.load を介してアセンブリを手動でロードしました。ただし、上記のアセンブリ解決エラーがログに記録され続け、機能しませんでした。最後に、必死に{ProjFolder}\MyAppExecs
なって、すべての DLL が 1 つのフォルダーに格納され、機能するように、Word プロジェクトの DLL をコピーしました。
から実行すると、管理されていない依存関係X.dll
が解決されていないように見えますが{ProjFolder}...
、ProcMon
その兆候は見られません。PATH 変数も更新して include を含めまし{ProjFolder}\MyAppExecs
たが、うまくいきませんでした。
したがって、すべてを1つのフォルダーにコピーするとうまくいきました。X.dll
私のコードではないので、これ以上調べることはできませんでした。
.net - .netランタイムが間違ったバージョンのアセンブリを使用しようとします
アセンブリ「Microsoft.Xna.Framework、Version = 2.0.0.0、Culture = neutral、PublicKeyToken=6d5c3888ef60e27d」を参照するアプリケーションがあります。このアセンブリをGACにインストールするインストーラープロジェクトを作成しました(XNA redistインストーラーを実行することにより)。
ただし、このアセンブリを最初に使用すると、JIT中に例外が発生します。次に、画像をngenしようとしましたが、ngenは次のエラーメッセージを表示します。
バージョンが1.0.0.0であり、PublicKeyTokenが欠落しており、偽のアセンブリが存在しないことに注意してください。JITerとngenがこの不良バージョンのアセンブリをロードしようとする原因は何ですか?
アセンブリの正しいバージョンはGACにあります。リフレクターで画像を開いたところ、参照が正しく表示されています。また、依存関係階層内の他のアセンブリが偽の1.0.0.0バージョンをロードしないことも確認しました。実際、1.0.0.0バージョンは、開発ボックスにもテストマシンにも存在しません。
ただし、テストマシンでMicrosoft.Xna.Frameworkへの参照を展開しようとすると、Reflectorは参照されているアセンブリバージョンが2.0.0.0であると(正しく)考えますが、GACで表示されている場合でも、それを見つけることができません。エクスプローラーでc:\ windows\assemblyを表示します。
助けてください。
.net - アセンブリ バインドのリダイレクトは、テスト ランナーを使用した単体テストで機能しますか?
さて、私が抱えている問題の完全な説明は次のとおりです。
NUnit ExtensionMethodsを使用しようとしていますが、TestDriven.Net を使用して拡張メソッドの 1 つを含むテストを実行するたびに、またはテスト ランナー GUI (Icarus または NUnit) を使用してアセンブリをロードしようとすると、FileNotFoundException が発生します。
頭を壁にぶつけて、さらに掘り下げていくと、何が悪いのか分かっていると思います。キューリフレクターとはい、NUnit.Framework>ExtensionMethods.dll に参照があることがわかります
そして、私が含めているnunitの現在のバージョンは
これまでアセンブリのリダイレクトを使用したことはありませんが、次の行で App.Config を追加するのは簡単なことのようです。
2.4.6 バージョン (このマシンには存在しません) への呼び出しは、自動的に 2.4.8 バージョンにリダイレクトされるはずです。
ただし、これは機能しません。これは、テスト ランナーが app.config ファイルを自動的に読み取らないためであると思われます (ただし、まだ確認していません)。
だから私の質問は次のとおりです:
問題の診断は正しいですか?
アセンブリのリダイレクトは適切な解決策ですか?また、私はそれを正しく行っていますか?
これをテストランナーで動作させるにはどうすればよいですか?
c# - ビルド サーバーでアセンブリ参照が正しく解決されない
VS2008 SP1 を使用して C# でコーディングします。ソース管理やタスクなどに使用する Team System Server 2008 を実行するサーバーがあります。このサーバーは、 Team Buildのビルド マシンでもあります。これは長い間うまく機能しています。今まで。1 つの外部アセンブリへの参照を持つプロジェクトの 1 つをビルドしようとすると、次のエラー メッセージが表示されます(これは、チーム ビルドを介して発生する場合と、物理的にログオンして Visual Studio を介して通常のビルドを実行する場合の両方で発生します)。
C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets : 警告 MSB3246:解決されたファイルのイメージが正しくないか、メタデータがないか、またはその他の理由でアクセスできません。ファイルまたはアセンブリ'C:\Program Files\Syncfusion\Essential Studio\7.1.0.21\Assemblies\3.5\Syncfusion.XlsIO.Base.dll' またはその依存関係の 1 つを読み込めませんでした。モジュールには、アセンブリ マニフェストが含まれている必要がありました。
C:\Program Files\MSBuild\Microsoft\VisualStudio\v9.0\ReportingServices\Microsoft.ReportingServices.targets(24,2): エラー MSB4062: "Microsoft.Reporting.RdlCompile" タスクをアセンブリ Microsoft. ReportViewer.Common、バージョン = 9.0.0.0、カルチャ = ニュートラル、PublicKeyToken = b03f5f7f11d50a3a。ファイルまたはアセンブリ 'Microsoft.ReportViewer.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' またはその依存関係の 1 つを読み込めませんでした。モジュールには、アセンブリ マニフェストが含まれている必要がありました。宣言が正しいこと、およびアセンブリとそのすべての依存関係が利用可能であることを確認してください。
参照されているコンポーネント 'Syncfusion.XlsIO.Base' が見つかりませんでした。
これらのエラーは、問題のあるアセンブリ参照が 1 つある 1 つのプロジェクトに関するものです。ソリューション全体を構築しようとすると、もちろん、これが原因でさらに多くのエラーが発生します。また、他のアセンブリ参照で同じ問題を抱えているプロジェクトが他に 2 つあります。VS が解決できないと思われる参照アセンブリのリストがあります。
- Microsoft.ReportViewer.Common
- Microsoft.ReportViewer.WinForms
- Syncfusion.Compression.Base
- Syncfusion.Core
- Syncfusion.XlsIO.Base
Syncfusion アセンブリは、サードパーティ コンポーネント パッケージからのものです。他の 2 つは、Microsoft ReportViewer コンポーネントに関連しています。
参照は [.NET] タブの [参照の追加] ウィンドウを介して追加されているため、疑わしい点はないと思います。アセンブリ参照のプロパティ ウィンドウで、カルチャ、説明、パス、ランタイム バージョン、または厳密な名前に値がありません。バージョンは 0.0.0.0 で、解決済みは False です。VSが参照を解決できないことは明らかだと思います。私の質問はなぜですか?私はこれについて頭を悩ませてきました。これはサーバー上でのみ発生し、ソリューションは私のマシンと同僚のマシンの両方で問題なくビルドされます。アセンブリ参照プロパティは、私たちのマシンでは問題ありません。
サードパーティのコンポーネントを(もちろんサーバー上で)アンインストールしてから、もう一度再インストールしてみました。役に立ちませんでした。VS2008のインストールを修復しようとしました。役に立ちませんでした。ソース管理から以前のバージョンを取得しようとしました(以前にサーバーにビルドされていることがわかっています)、同じエラー メッセージが表示されました。ファイルのアクセス許可を確認しましたが、すべて問題ないようです。アイデアが尽きた…
これを解決するにはどうすればよいですか?
更新 16.02.2009: PC とサーバーの dll のildasm 出力を比較
しようとしました (それについて書いたコメントを参照してください)。1 行に 1 つの小さな違いがあり、それがコメントのように見えます。なぜ違いがあるのか まったくわからないことを認めなければならないので、誰かが私にそれを説明してくれるでしょうか?また、サーバーでウイルススキャンを
実行してみました。役に立ちませんでした。参照を削除してから、ディスク上のdllを参照して再読み込みしようとしました。うまくいきませんでした。
更新 17.03.2009:
解決策を見つけました! 犯人はPanda Antivirus の TruPrevent モジュールでした。モジュールを無効にすると、すべてが機能します。=) fuslogvw.exeとそれが生成したログ
の助けを借りて、これを発見しました。結果をグーグルで検索し、このブログエントリに出くわしました。. これが他の誰かに役立つことを願っています。
.net - アセンブリのロード元を強制するにはどうすればよいですか?
サーバー アプリケーションに対していくつかの操作を実行するコンソール ユーティリティを開発しました。私が使用しているサーバー アプリの性質上、サーバー上でこのユーティリティを実行する必要があります。
問題は、ユーティリティが以前にサーバーの GAC に展開された共通の DLL を参照していることです。共通 DLL の展開以来、それは更新されており、私のユーティリティはこれらの更新に依存しています。展開に関する会社のポリシーにより、GAC で DLL を更新できません。
デフォルトでは、ユーティリティは GAC の古い DLL を使用します。更新された DLL を強制的に使用する方法はありますか (たとえば、ファイル システムのパスを指定するなど)?
c# - C#でメモリからプログラムを起動するにはどうすればよいですか?
C# で記述されたユーザーのタスク バーにある UI アプリケーションがあります。ツールの EXE は、それを使用する多くのプロジェクトのソース管理システムにチェックインされているため、更新された EXE をチェックインすることで、実行するバージョンを更新できます。
問題は、ユーザーが exe の最新リビジョンを取得すると、プログラムが頻繁に実行され、マシンで同期が失敗することです。プログラムが実行時にexeと依存DLLをロックしないように修正して、プログラムをシャットダウンせずに同期できるようにします。
現在、実行可能ファイルをパラメーターとして受け取り、事前にアセンブリの内容をメモリに読み込んでメモリから起動するプログラムがあります。残念ながら、プログラムが必要とする DLL に関しては、これは完全に失敗します。
私が今持っているコードは次のようになります。
私の質問は、私はまったくばかげたことをしているのでしょうか? これを処理するより良い方法はありますか?そうでない場合、外部依存関係の処理をサポートするにはどうすればよいですか?
たとえば、上記のコードは、「Bar.dll」の関数を使用する「Foo.exe」を実行しようとすると、依存ファイルのロードに失敗します。「Foo.exe」は上書き可能になりますが、「Bar.dll」は依然としてロックされ、上書きできません。
ロードされたアセンブリの 'GetReferencedAssemblies()' メソッドから参照アセンブリのリストを取得しようとしましたが、アセンブリがどこからロードされるべきかを示すものではないようです...自分でそれらを検索する必要がありますか? もしそうなら、これを行う最善の方法は何ですか?
他の人が以前にこれに遭遇した可能性があるようで、私は車輪を再発明したくありません.
- 更新: EXE がチェックインされているのは、社内ツールを使用するチームに社内ツールを配布するためです。このユースケースには最適ではありませんが、そのポリシーを変更する機会はありません。
.net - csc / mcs に特定のバージョンのアセンブリ参照を使用させるにはどうすればよいですか?
署名されたアセンブリの特定のバージョンを参照する必要があります。GAC に存在するため、コンパイラは、私が提供するものではなく「ベンダー」バージョンを取得します (古い API であっても、GAC のバージョン番号の方が高くなります)。/reference=Library.dll
厳密な名前を指定できる基本的なコンパイラ オプションの拡張機能はありますか?
私は NAnt でコンパイルしているので、<csc>
タスクベースのソリューションが最適ですが、コンパイラ コマンド ライン (csc と mcs) も問題ありません。
msbuild - 解決方法: カスタム MSBuild タスクには、AppBase 外でのアセンブリが必要です
C# プロジェクトをビルドするときに実行したいカスタム タスクがあります。このタスクは、別のアセンブリ MyCommon.DLL を参照する MyTask.dll にあります。
問題は、MyCommon.dll が MyTask.dll に対して "..\Common\MyCommon.dll" にあり、MSBuild プロセスの AppBase ディレクトリの外に置かれていることです。MSBuild のログを分析し、バインドの失敗に関する Fusion のレポートを見て、これが実際に問題であることを確認しました。
ビルド プロセス中に Fusion に MyCommon.dll を検出させるにはどうすればよいですか? アセンブリを移動すると、それに依存するアプリが壊れることに注意してください。
更新: まあ、結局はコピーを使用するようです。他のソリューションはすべてシステム全体の変更を必要としますが、これはここでは保証されません。