8

Visual Studio 2008 で、(プロジェクト ルートにある) WinScp.dll を参照として追加すると、すぐに黄色のアイコンが表示されました。コンパイル時:

  • 型または名前空間名 'WinSCP' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)
  • 解決されたファイルは、イメージが悪いか、メタデータがないか、またはアクセスできません。ファイルまたはアセンブリ 'E:...\winscp.exe' またはその依存関係の 1 つを読み込めませんでした。モジュールには、アセンブリ マニフェストが含まれている必要がありました。

1 時間のフラストレーションの後、WinSCP.exe をプロジェクト ファイル (プロジェクト ルートにもある) として削除すると、すべてが正常にコンパイルされることがわかりました。変!!!!

問題は、出力ディレクトリに WinSCP.dll と WinSCP.exe の両方が必要なことです。私は何をしますか?

編集:ファイルの名前を変更したり、パスを変更したりするなどの回避策があることを理解しています。最初にexeの名前を変更しました。コードで名前を変更したexeも指定する必要がないため、dllの名前を変更します(@Michaelに感謝します)。

しかし、そもそもなぜ問題があるのでしょうか。WinSCP.dll と WinSCP.exe は 2 つの異なるファイルです。これは Visual Studio のバグですか、それとも私が理解できない dll/exe の複雑さですか?

4

1 に答える 1

7

WinSCP.dll と WinSCP.exe は 2 つの異なるファイルです

アセンブリローダーではなく、ファイル名の拡張子に注意を払いません。わかっているのは、表示名が "winscp"のアセンブリを見つける必要があるということだけです。一致するものを検索するとき、最初にその名前の EXE ファイルを試み、次に DLL ファイルを試みます。Fuslogvw.exe ユーティリティで確認できること。表示名については、Fusion コンポーネントを担当した Microsoft の担当者による次のブログ投稿で説明されています。

「名前」の部分は、通常、拡張子を除いたアセンブリのファイル名です。したがって、アセンブリ foo.dll の場合、「名前」の部分は「foo」です。もちろん「普通に」と言ったので、「名前」の部分が拡張子を除いたファイル名と一致しない場合もあります。これについては後ほど説明します。

強調が追加されました。そのため、最初に WinSCP.exe が検出されます。これは kaboom であり、有効な .NET アセンブリではありません。簡単な回避策は、アセンブリの表示名を変更する DLL の名前を変更することです。

于 2013-02-19T19:13:15.127 に答える