0

system.windows.interactivity.dll を参照する ac# プロジェクトを作成しました。
私が疑問に思っているのは、*.exe をビルドするときに次のような構造になるようにプロジェクトを設定する方法です。

Program Folder
    program.exe
Libraries Folder
    system.windows.interactivity.dll

プロジェクト フォルダーと同じレベルになるように、ソリューション フォルダーの下に "Libraries" フォルダーを配置して、少し実験を試みました。これにより、「..\Libraries\system.windows.interactivity.dll」の csproj ファイルに相対パスが与えられますが、コンパイル時に dll が exe と共にデバッグ フォルダーにコピーされ、これが保持されるため、これは解決策にはなりません。 「同じレベル」のパス構造。

dllを別のディレクトリに配置して参照するように変更するにはどうすればよいですか?

[更新]
そこで、プロジェクトで以下を
変更しました。 1: 参照 system.windows.interactivity.dll の 'Copy Local' プロパティを False に変更しました。
2: csproj ファイルに次のコードを追加して、Libraries フォルダーが出力ディレクトリの上に存在するかどうかを確認し、存在しない場合は作成してから dll をコピーします。

  <Target Name="BeforeBuild">
    <MakeDir Directories="$(OutDir)..\Libraries" 
             Condition="!Exists('$(OutDir)..\Libraries')" />
    <Copy SourceFiles="..\Libraries\System.Windows.Interactivity.dll" 
          DestinationFolder="$(OutDir)..\Libraries" 
          ContinueOnError="True" />
  </Target>

3. 次のコードを App.config に追加して、アプリが dll を検索する別の場所を追加します。

<configuration>
    <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <probing privatePath="..\Libraries"/>
      </assemblyBinding>
    </runtime>
</configuration>

私の調査結果:
アプリをビルドすると、元の投稿の構造のように、すべてのファイルが必要な場所に正確に配置されます。出力ディレクトリからexeを実行しようとすると、dllが見つかりません。

[/アップデート]

4

1 に答える 1

1

app.config を使用すると、サブディレクトリを調べてアセンブリを検索するように .NET に指示できます (.NET は、アプリケーションが非標準の場所にあるときに実行されるときに DLL を見つける方法を知る必要があります)。

https://msdn.microsoft.com/en-us/library/823z9h8w(v=vs.110).aspx

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="bin;bin2\subbin;bin3"/>
      </assemblyBinding>
   </runtime>
</configuration>

.csproj ファイルを変更して、BeforeBuild/AfterBuild タスクを実行し、dll をサブディレクトリにコピーできます。ただし、この構造を展開用に本当に必要とする場合は、直接ビルド ロジックではなく、パッケージ/インストーラー ロジックの一部として含める方が簡単でしょう。通常、DLL の出力先をコンパイラに選択させる方がはるかに簡単です。

BeforeBuild コピー タスクを作成する方法の例を次に示します。

msbuild を使用してすべてのファイルとフォルダーをコピーする

参照で "Copy Local" を false に設定することで、DLL を出力フォルダーにコピーしないように Visual Studio に指示できます。

于 2016-09-23T01:49:56.650 に答える