9

既定のAppDomainに特定のアセンブリのシャドウ コピーを使用させることはできますか? では、特定のディレクトリの既定の AppDomain 内でシャドウ コピーを有効にする実用的なソリューションについて説明しています。

基本的に、これらの単純な方法を使用するように指示されています。

AppDomain.CurrentDomain.SetShadowCopyPath(aDirectory);
AppDomain.CurrentDomain.SetShadowCopyFiles();

しかし、ここで使用されているメソッドは古いものとしてマークされているため、同じことを達成する正しい方法は何なのか疑問に思っていました. 警告メッセージは、次のことを示唆しています。

代わりに AppDomainSetup.ShadowCopyDirectories の使用を調査してください

AppDomain には、このタイプのメンバーが呼び出されSetupInformation、この簡単な実装にたどり着く可能性があります。

AppDomain.CurrentDomain.SetupInformation.ShadowCopyDirectories = aDirectory;
AppDomain.CurrentDomain.SetupInformation.ShadowCopyFiles = "true";

残念ながら、これは効果がありません。問題は、現在の appdomain の AppDomainSetup を変更してシャドウ コピーを有効にする方法はありますか?

4

2 に答える 2

15

私の知る限り、これらのメソッドは .NET Framework バージョン 1.1 でのみ機能します。それ以降のすべてのバージョンでは、メインの AppDomain でシャドウ コピーを有効にすることはできません。新しいものを作成し、AppDomain適切に設定する必要があります。簡単なアプローチは、単純に次のようなローダー アプリケーションを作成することです。

適切な出発点は、アプリケーションCodeProject のシャドウ コピーの記事にあります。次のプログラムは、わずかな変更を加えて記事から取得したものです (キャッシュ パスは指定されていません。

using System;
using System.IO;

namespace Loader
{
    static class Program
    {
        [LoaderOptimization(LoaderOptimization.MultiDomainHost)]
        [STAThread]
        static void Main()
        {
            /* Enable shadow copying */

            // Get the startup path. Both assemblies (Loader and
            // MyApplication) reside in the same directory:
            string startupPath = Path.GetDirectoryName(
                System.Reflection.Assembly
                .GetExecutingAssembly().Location);

            string configFile = Path.Combine(
                startupPath,
                "MyApplication.exe.config");
            string assembly = Path.Combine(
                startupPath,
                "MyApplication.exe");

            // Create the setup for the new domain:
            AppDomainSetup setup = new AppDomainSetup();
            setup.ApplicationName = "MyApplication";
            setup.ShadowCopyFiles = "true"; // note: it isn't a bool
            setup.ConfigurationFile = configFile;

            // Create the application domain. The evidence of this
            // running assembly is used for the new domain:
            AppDomain domain = AppDomain.CreateDomain(
                "MyApplication",
                AppDomain.CurrentDomain.Evidence,
                setup);

            // Start MyApplication by executing the assembly:
            domain.ExecuteAssembly(assembly);

            // After the MyApplication has finished clean up:
            AppDomain.Unload(domain);
        }
    }
}

あなたはしなければならない:

  • MyApplication.exe実行可能アセンブリの名前に置き換えます。
  • MyApplicationアプリケーションの名前に置き換えます。
  • MyApplication.exe.configアプリケーションの構成ファイルの名前に置き換えます。持っていない場合は、これを設定する必要はありません。
于 2013-03-11T15:57:20.400 に答える