私のアプリケーションで新しいロングパスサポートを使用しようとしています。 (詳細https://blogs.msdn.microsoft.com/dotnet/2016/08/02/announcing-net-framework-4-6-2/のリンクを参照)、それを使用するためには、自分のマシン上でinstelled最新の.NET 4.6.2バージョンを持っているようにクライアントを強制することなく、1が唯一の彼はapp.configにそれらの要素を追加する必要がありますUseLegacyPathHandlingがapp.configランタイム要素から正しくロードされていません
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1"/>
</startup>
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false" />
</runtime>
実行プロジェクトで使用すると完全に動作します。問題は私のテストプロジェクト(Nunitを使用している)です。実行プロジェクトに追加したのと同じ方法でapp.configをテストプロジェクトに追加しました。
ConfigurationManagerクラスを使用すると、私はアプリの設定が実際に読み込まれるように管理しています(短く:ユニットテストで取得できたアプリ設定を使用して)。
ConfigurationManager.GetSection(「ランタイム」)を使用して、ランタイム要素が正しくロードされていることを管理することさえできました(_rawXmlの値はapp.configと同じです)。
しかし、何らかの理由でapp configのランタイム要素がUseLegacyPathHandling変数に影響を及ぼさないため、長いパスでのすべての呼び出しが失敗します。
この問題は、テストプロジェクトが、実行エントリポイントであるNunitエンジンを使用してロードされたDLLになるという事実と関係していると思います。
私はOffice Wordアプリケーションによって読み込まれたDLLである別のプロジェクトでまったく同じ問題に直面しています。両方のケースで問題は同じだと思うし、プロジェクトが実行のエントリーポイントではないという事実から派生していると思う。
私は自分の実行形式(Word OfficeまたはNunit)にアクセスできないため、自分で設定することはできません。
どうやらAppContextSwitchOverridesをゼロから動的にロードさせるオプションがありますか?その他のアイデアは大歓迎です。ありがとう。
また、app.configに使用するスタイルシートをチェックアウトすると、rutimeセクションにはprocessContents = "skip"プロパティがあります。私はこれがこのセクションの処理を全く妨げているのだろうかと思います。 –
詳しい調査によれば、より多くの問題があることがわかります。 AppContextDefaultsはユーザーコードが実行される前に設定されているため、設定を正しく読み込むことができない場合は、反映されずにこれらのオプションを再構成する方法はありません。また、テストエンジンは、アセンブリ用に指定されたものではなく、テストエンジン用の.configファイル(ユニットテストセッションウィンドウのvstest.executionengine.x86.exe.Config)を使用することも明らかです。これは、ランタイムセクションが無視される理由を説明します(既にロードされているので不要です)。悲劇的に、私はこれの回避策をまだ見つけていない。 –
また、私の最後のコメントを読んで、なぜ私が実行時に設定を読み込んでいるのではないか疑問に思うなら、AppContextSwitchesでキャッシングがどのように実装されているかチェックしてください(一度設定すれば設定で.NET4.6.1以前)。したがって、AppContextDefaultValues.Defaults.csに5つの既定値がデフォルト設定されている場合、これらの変更に対してテストを書くことはできません。 –