11

c#を使って簡単なプログラムを作ろうとしていGrowl C# APIます。

私は2つの異なる方法でプログラムをコンパイルしようとしました:

1).dllファイルをファイルと同じディレクトリに保存しました.cs。私が走ったより

csc /r:Growl.Connector.dll,Growl.CoreLibrary.dll /out:test.exe *.cs

それはうまくコンパイルされ、またうまく動作しました。

2)これで、現在の作業ディレクトリ内に名前付きのディレクトリを作成し、growlすべての.dll参照をそこに保持しました。

以下のコマンドを使用してコンパイルしようとすると

csc /r:"D:\Modified\Growl_NET_Connector_SDK\libraries\growl\Growl.Connector.dll","D:
\Modified\Growl_NET_Connector_SDK\libraries\growl\Growl.CoreLibrary.dll" /out:test.exe *.cs

正常にコンパイルされましたが、実行しようとすると、以下の例外が発生しました。

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'Growl.Connector, Version=2.0.0.0, Culture=n
eutral, PublicKeyToken=980c2339411be384' or one of its dependencies. The system cannot find the file specified.
 at GrowlNotification.Program.Main(String[] args)

だから、私の質問は、ファイルが外部フォルダにあるときにファイル.dllを参照する正しい方法は何ですか?csc

2番目のケースのディレクトリ構造は次のとおりです。

4

3 に答える 3

11

だから、私の質問は、ファイルが外部フォルダにあるときにcscで.dllファイルを参照する正しい方法は何ですか?

ビルド時にすでにそれらを参照しています。実行時にも利用できるようにする必要がありますが、実行する場合は実行可能ファイルと同じディレクトリにコピーします。

これらが署名されたアセンブリである場合は、グローバルアセンブリキャッシュを使用して調査することもできますが、個人的には、実行可能ファイルを依存するライブラリと一緒に保持することに固執します。

于 2012-05-23T15:13:03.950 に答える
3

これらは、コンパイル中に/libおよび/referenceコマンドラインスイッチを使用して追加できます。

http://msdn.microsoft.com/en-us/library/s5bac5fx.aspx

しかし (記事からの引用)

/ libを使用する代わりに、必要なアセンブリを作業ディレクトリにコピーすることもできます。これにより、アセンブリ名を/referenceに渡すだけで済みます。その後、作業ディレクトリからアセンブリを削除できます。依存するアセンブリへのパスはアセンブリマニフェストで指定されていないため、アプリケーションはターゲットコンピューターで起動でき、グローバルアセンブリキャッシュでアセンブリを見つけて使用します。

コンパイラはアセンブリを参照できるため、共通言語ランタイムが実行時にアセンブリを見つけてロードできることを意味するものではありません。ランタイムが参照されるアセンブリを検索する方法の詳細については、ランタイムがアセンブリを見つける方法を参照してください。

だからジョンスキートの答えはより良いです。(私はこれを追加して、回答としてではなく、コメントでできるよりも多くの情報を提供しています。ジョンの回答は最高のIMOです)

于 2012-05-23T15:15:58.647 に答える
1

ライブラリフォルダ内のアセンブリへのシンボリックリンクを作成できるため、1つの場所でアセンブリを更新するだけで済みます。

于 2017-08-31T18:00:26.540 に答える