相关疑难解决方法(0)

长路径\\?\ workaround无法处理某些安装

我正在处理的应用程序需要处理具有很长文件/路径名的文件.这是一个.Net 4.6应用程序,所以我实现了4.6.2之前的解决方法,以允许此处此处概述的\\?\语法.

这是我用来启用该功能的代码(我无法修改app.config,因此必须在代码中设置):

var type = Type.GetType("System.AppContext");
if (type != null)
{
    AppContext.SetSwitch("Switch.System.IO.UseLegacyPathHandling", false);
    AppContext.SetSwitch("Switch.System.IO.BlockLongPaths", false);

    var switchType = Type.GetType("System.AppContextSwitches");
    if (switchType != null)
    {
        // We also have to reach into System.AppContextSwitches and manually update the cached private versions of these properties (don't ask me why):

        var legacyField = switchType.GetField("_useLegacyPathHandling", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
        legacyField?.SetValue(null, (Int32)(-1)); // <- caching uses 0 to indicate no value, -1 for false, 1 for true.

        var blockingField = switchType.GetField("_blockLongPaths", System.Reflection.BindingFlags.Static …
Run Code Online (Sandbox Code Playgroud)

c# windows registry file file-handling

6
推荐指数
1
解决办法
126
查看次数

UseLegacyPathHandling 未从 app.config 运行时元素正确加载

我正在尝试在我的应用程序中使用新的长路径支持。为了使用它,而不强迫客户在其计算机上安装最新的 .NET 4.6.2 版本,只需将这些元素添加到他的 app.config 中(有关更多信息,请参阅链接https://blogs.msdn。 microsoft.com/dotnet/2016/08/02/announcing-net-framework-4-6-2/):

<startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1"/>
</startup>
<runtime>
    <AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false" />
</runtime>
Run Code Online (Sandbox Code Playgroud)

当我在我的执行项目中使用它时,它工作得很好。问题出在我的测试项目(使用 Nunit)中。我已将 app.config 添加到我的测试项目中,就像将其添加到执行项目中一样。

使用 ConfigurationManager 类,我设法确保应用程序配置确实已加载(简而言之:使用我能够在单元测试中检索的应用程序设置)。

使用 ConfigurationManager.GetSection("runtime"),我什至设法确保运行时元素已正确加载(_rawXml 值与 app.config 中的值相同)。

但是(!)由于某种原因,应用程序配置运行时元素不会影响 UseLegacyPathHandling 变量,因此我所有具有长路径的调用都会失败。

我想这个问题在某种程度上与以下事实有关:测试项目变成了使用 Nunit 引擎加载的 dll,Nunit 引擎是执行入口点。

我在另一个项目中遇到了完全相同的问题,该项目是由 Office Word 应用程序加载的 dll。我相信这两种情况下的问题是相同的,并且源于项目并不意味着成为执行切入点这一事实。

重要的是要明白,我无法访问自己的执行(Word Office 或 Nunit),因此我无法自己配置它们。

是否有一个选项可以以某种方式使 AppContextSwitchOverrides 从头开始​​动态加载?其他想法将受到欢迎。

asp.net-4.5 .net-4.6.2

3
推荐指数
1
解决办法
1968
查看次数

标签 统计

.net-4.6.2 ×1

asp.net-4.5 ×1

c# ×1

file ×1

file-handling ×1

registry ×1

windows ×1