如何更改 .NET 应用程序的预定义 userconfig 目录?

2023-12-07

目前我的应用程序的用户设置存储在这个默认目录中:

C:\Users\{User Name}\AppData\Roaming\{Company Name}\{Assembly Name}.vshos_Url_{Hash}\{Assembly Version}

我知道默认的 Microsoft 命名规则的含义,我的问题是:如何在执行时或通过修改 appconfig 文件来更改默认文件夹?

我的目的是只能处理保存应用程序用户设置的目录,例如我想将用户设置文件保存在此目录中:

C:\Users\{User Name}\AppData\Roaming\{Assembly Name}

我知道这是可能实现的,因为我见过很多 .NET 应用程序可以将其用户配置文件存储在自定义漫游文件夹中,该文件夹不遵循 Microsoft 默认规则以及未处理的哈希和其他烦人的命名规则。


该命名约定的存在使得 NET 可以确保加载正确的设置。由于您已将管理设置的控制权交给了 NET Framework/VB 应用程序框架,因此它还承担了确保应用程序加载正确的设置集的责任。既然如此,证据哈希就是用来唯一标识一个WindowsApplication1来自另一个(除其他外)。

I know this is possible to acchieve, because I've seen much .NET applications that can store its userconfig file in a custom Roaming folder

这是有可能的,但我不确定一切都是你得出的结论。我非常怀疑,当许多应用程序可以使用自定义设置类更轻松地将 XML 文件保存到该位置时,它们会经历实现自定义提供程序的麻烦。

简单的解决方案

编写您自己的用户选项类,并自行序列化。例如,可以使用共享/静态方法以很少的代码反序列化类(这恰好使用 JSON):

Friend Shared Function Load() As UserOptions
    ' create instance for default on new install 
    Dim u As New UserOptions

    If File.Exists(filePath) Then
        ' filepath can be anywhere you have access to!
        Dim jstr = File.ReadAllText(filePath)
        If String.IsNullOrEmpty(jstr) = False Then
            u = JsonConvert.DeserializeObject(Of UserOptions)(jstr)
        End If
    End If

    Return u
End Function

实现它的应用程序:

UOpt = UserOptions.Load()

之间Pros, 你有完全控制文件的保存位置,并且可以使用您喜欢的任何序列化器。最重要的是,它是simple- 代码比下面介绍的要少得多。

The Cons使用它的代码必须手动加载和保存它们(在应用程序事件中轻松处理),并且没有花哨的设计器。

漫长而曲折的道路:自定义SettingsProvider

一个习俗SettingsProvider将允许您更改设置的处理、保存和加载方式,包括更改文件夹位置。

这个问题主要集中在更改文件位置。问题是你的应用程序没有一种(干净、简单)的方式与你的应用程序对话。SettingsProvider以指定文件夹。提供商需要能够在内部解决这个问题,当然还要保持一致。

大多数人想要做的不仅仅是更改所使用的文件夹名称。例如,在尝试过程中,我使用了 SQLite 数据库来代替 XML,它反映了代码使用的结构。这使得加载本地和正确的漫游值变得非常容易。如果始终采用这种方法,代码可能会大大简化,整个升级过程也可能会大大简化。因此,该提供商考虑了一些更广泛的需求。

即使您只想更改文件名,也有两个关键注意事项:

本地与漫游

对提供者进行编码以始终存储在AppData\Roaming但写出不合格的本地设置那就是不负责任的了。区分它们是一项不应该为了消除文件夹名称中的证据哈希而牺牲的功能。

注:每Setting可以设置为Roaming or Local值:在设置编辑器中选择设置后,打开属性窗格 - 更改Roaming为真。

这里关于处理定制的(非常)几个问题似乎达成了共识SettingsProvider将本地和漫游保存到同一文件但不同的部分。这很有意义 - 并且比从 2 个文件加载更简单 - 因此使用的 XML 结构是:

<configuration>
  <CommonShared>
    <setting name="FirstRun">True</setting>
    <setting name="StartTime">15:32:18</setting>
    ...
  </CommonShared>
  <MACHINENAME_A>
    <setting name="MainWdwLocation">98, 480</setting>
    <setting name="myGuid">d62eb904-0bb9-4897-bb86-688d974db4a6</setting>
    <setting name="LastSaveFolder">C:\Folder ABC</setting>
  </MACHINENAME_A>
  <MACHINENAME_B>
    <setting name="MainWdwLocation">187, 360</setting>
    <setting name="myGuid">a1f8d5a5-f7ec-4bf9-b7b8-712e80c69d93</setting>
    <setting name="LastSaveFolder">C:\Folder XYZ</setting>
  </MACHINENAME_B>
</configuration>

漫游项目存储在以它们所使用的 MachineName 命名的部分中。保留这些可能有一定的价值<NameSpace>.My.MySettings节点,但我不确定它的用途是什么。

我删除了SerializeAs元素,因为它没有被使用。

Versions

如果你调用,什么都不会发生My.Settings.Upgrade。尽管它是一个Settings方法,它实际上是在ApplicationSettingsBase,因此您的提供商不参与其中。

因此,如果自动递增最后一个元素,则使用完整版本字符串作为文件夹的一部分会导致问题。简单的重建将创建一个新文件夹并丢失并孤立旧设置。当没有当前文件时,也许您可​​以查找并加载先前版本的值。然后也许删除该旧文件/文件夹,因此始终只有一组可能的旧设置。请随意添加大量合并代码。

出于更改数据存储文件夹的主要目的,我删除了版本文件夹部分。使用全局提供程序时,代码会自动累积设置。已删除的设置不会“泄漏”到应用程序中,因为 NET 不会要求其值。唯一的问题是 XML 中会有一个值。

我添加了代码来清除这些。如果您稍后重复使用不同类型的设置名称,这将防止出现问题。旧的保存值Foo as Decimal不能与新的一起使用Foo as Size例如。如果你从根本上改变一种类型,事情仍然会变得很糟糕。不要那样做。


这个答案user.config 的自定义路径为定制提供商提供了一个非常好的起点。它有一些问题,并且缺少一些东西,但为任何提供商典型的一些步骤和样板代码提供了快速入门指南。由于许多人可能需要进一步修改此处的提供程序,因此可能值得阅读(并投票)。

这里的代码借鉴了该答案的一些内容:

  • 添加各种改进
  • 提供自定义路径
  • 检测设置为漫游的设置
  • 文件中的本地和漫游部分
  • 正确处理复杂类型,例如Point or Size
  • 检测并删除已删除的设置
  • is in VB

1. 设置

在大多数情况下,您无法增量地编写/调试它 - 在完成之前几乎不会起作用。

  • 添加参考System.Configuration
  • 向您的项目添加一个新类

Example:

Imports System.Configuration 
Public Class CustomSettingsProvider
    Inherits SettingsProvider
End Class

接下来,转到设置设计器并添加一些用于测试的设置。将某些标记为漫游以进行完整测试。然后单击<> View Code此处显示的按钮:

enter image description here Everyone loves freehand circles!

显然有两种方法可以实现自定义提供程序。这里的代码将使用您的代码代替My.MySettings。您还可以通过在“属性”窗格中键入提供程序名称来为每个设置指定自定义提供程序,并跳过此步骤的其余部分。我没有对此进行测试,但这就是它应该如何工作。

为了使用“您”编写的新设置提供程序,它需要与MySettings使用属性:

Imports System.Configuration 

<SettingsProvider(GetType(ElectroZap.CustomSettingsProvider))>
Partial Friend NotInheritable Class MySettings
End Class

顺便说一下,“ElektroZap”是您的根命名空间,“ElektroApp”是您的应用程序名称。构造函数中的代码可以更改为使用产品名称或模块名称。

我们已经完成了该文件;保存并关闭它。

2. 设置提供者

首先,请注意,此 CustomProvider 是通用的,只需将其指定为SettingsProvider。但它实际上只做了两件事:

  • 使用自定义路径
  • 将本地和漫游设置合并到一个文件中

通常,在求助于自定义提供商之前,人们会拥有更长的待办事项列表,因此对于许多人来说,这可能只是提供其他事情的起点。请记住,某些更改可能会使其特定于某个项目。


添加的内容之一是支持更复杂的类型,例如Point or Size。它们被序列化为不变字符串,以便可以对其进行解析。这意味着什么:

Console.WriteLine(myPoint.ToString())

结果,{X=64, Y=22}不能直接转换回来Point缺少一个Parse/TryParse方法。使用不变字符串形式64,22允许它转换回正确的类型。原始链接代码仅使用:

Convert.ChangeType(setting.DefaultValue, t);

这适用于简单类型,但不适用于Point, Font等等。我不能确定,但​​我认为这是一个简单的使用错误SettingsPropertyValue.Value而不是.SerializedValue.

3. 守则

Public Class CustomSettingsProvider
    Inherits SettingsProvider

    ' data we store for each item
    Friend Class SettingsItem
        Friend Name As String
        'Friend SerializeAs As String           ' not needed
        Friend Value As String
        Friend Roamer As Boolean
        Friend Remove As Boolean                ' mutable
        'Friend VerString As String             ' ToDo (?)
    End Class

    ' used for node name
    Private thisMachine As String

    ' loaded XML config
    'Private xDoc As XDocument
    Private UserConfigFilePath As String = ""
    Private myCol As Dictionary(Of String, SettingsItem)


    Public Sub New()
        myCol = New Dictionary(Of String, SettingsItem)

        Dim asm = Assembly.GetExecutingAssembly()
        Dim verInfo = FileVersionInfo.GetVersionInfo(asm.Location)
        Dim Company = verInfo.CompanyName
        ' product name may have no relation to file name...
        Dim ProdName = verInfo.ProductName

        ' use this for assembly file name:
        Dim modName = Path.GetFileNameWithoutExtension(asm.ManifestModule.Name)
        ' dont use FileVersionInfo;
        ' may want to omit the last element
        'Dim ver = asm.GetName.Version


        '  uses `SpecialFolder.ApplicationData`
        '    since it will store Local and Roaming val;ues
        UserConfigFilePath = Path.Combine(GetFolderPath(SpecialFolder.ApplicationData),
                                      Company, modName,
                                       "user.config")

        ' "CFG" prefix prevents illegal XML, 
        '    the FOO suffix is to emulate a different machine
        thisMachine = "CFG" & My.Computer.Name & "_FOO"

    End Sub

    ' boilerplate
    Public Overrides Property ApplicationName As String
        Get
            Return Assembly.GetExecutingAssembly().ManifestModule.Name
        End Get
        Set(value As String)

        End Set
    End Property

    ' boilerplate
    Public Overrides Sub Initialize(name As String, config As Specialized.NameValueCollection)
        MyBase.Initialize(ApplicationName, config)
    End Sub

    ' conversion helper in place of a 'Select Case GetType(foo)'
    Private Shared Conversion As Func(Of Object, Object)

    Public Overrides Function GetPropertyValues(context As SettingsContext,
                                                collection As SettingsPropertyCollection) As SettingsPropertyValueCollection
        ' basically, create a Dictionary entry for each setting,
        ' store the converted value to it
        ' Add an entry when something is added
        '
        ' This is called the first time you get a setting value
        If myCol.Count = 0 Then
            LoadData()
        End If

        Dim theSettings = New SettingsPropertyValueCollection()
        Dim tValue As String = ""

        ' SettingsPropertyCollection is like a Shopping list
        ' of props that VS/VB wants the value for
        For Each setItem As SettingsProperty In collection
            Dim value As New SettingsPropertyValue(setItem)
            value.IsDirty = False

            If myCol.ContainsKey(setItem.Name) Then
                value.SerializedValue = myCol(setItem.Name)
                tValue = myCol(setItem.Name).Value
            Else
                value.SerializedValue = setItem.DefaultValue
                tValue = setItem.DefaultValue.ToString
            End If

            ' ToDo: Enums will need an extra step
            Conversion = Function(v) TypeDescriptor.
                                    GetConverter(setItem.PropertyType).
                                    ConvertFromInvariantString(v.ToString())

            value.PropertyValue = Conversion(tValue)
            theSettings.Add(value)
        Next

        Return theSettings
    End Function

    Public Overrides Sub SetPropertyValues(context As SettingsContext,
                                           collection As SettingsPropertyValueCollection)
        ' this is not called when you set a new value
        ' rather, NET has one or more changed values that
        ' need to be saved, so be sure to save them to disk
        Dim names As List(Of String) = myCol.Keys.ToList
        Dim sItem As SettingsItem

        For Each item As SettingsPropertyValue In collection
            sItem = New SettingsItem() With {
                                .Name = item.Name,
                                .Value = item.SerializedValue.ToString(),
                                .Roamer = IsRoamer(item.Property)
                            }
            '.SerializeAs = item.Property.SerializeAs.ToString(),

            names.Remove(item.Name)
            If myCol.ContainsKey(sItem.Name) Then
                myCol(sItem.Name) = sItem
            Else
                myCol.Add(sItem.Name, sItem)
            End If
        Next

        ' flag any no longer used
        ' do not use when specifying a provider per-setting!
        For Each s As String In names
            myCol(s).Remove = True
        Next

        SaveData()
    End Sub

    ' detect if a setting is tagged as Roaming
    Private Function IsRoamer(prop As SettingsProperty) As Boolean
        Dim r = prop.Attributes.
                    Cast(Of DictionaryEntry).
                    FirstOrDefault(Function(q) TypeOf q.Value Is SettingsManageabilityAttribute)

        Return r.Key IsNot Nothing
    End Function

    Private Sub LoadData()
        ' load from disk
        If File.Exists(UserConfigFilePath) = False Then
            CreateNewConfig()
        End If

        Dim xDoc = XDocument.Load(UserConfigFilePath)
        Dim items As IEnumerable(Of XElement)
        Dim item As SettingsItem

        items = xDoc.Element(CONFIG).
                             Element(COMMON).
                             Elements(SETTING)

        ' load the common settings
        For Each xitem As XElement In items
            item = New SettingsItem With {.Name = xitem.Attribute(ITEMNAME).Value,
                                          .Roamer = False}
            '.SerializeAs = xitem.Attribute(SERIALIZE_AS).Value,

            item.Value = xitem.Value
            myCol.Add(item.Name, item)
        Next

        ' First check if there is a machine node
        If xDoc.Element(CONFIG).Element(thisMachine) Is Nothing Then
            ' nope, add one
            xDoc.Element(CONFIG).Add(New XElement(thisMachine))
        End If
        items = xDoc.Element(CONFIG).
                            Element(thisMachine).
                            Elements(SETTING)

        For Each xitem As XElement In items
            item = New SettingsItem With {.Name = xitem.Attribute(ITEMNAME).Value,
                                          .Roamer = True}
            '.SerializeAs = xitem.Attribute(SERIALIZE_AS).Value,

            item.Value = xitem.Value
            myCol.Add(item.Name, item)
        Next
        ' we may have changed the XDOC, by adding a machine node 
        ' save the file
        xDoc.Save(UserConfigFilePath)
    End Sub

    Private Sub SaveData()
        ' write to disk

        Dim xDoc = XDocument.Load(UserConfigFilePath)
        Dim roamers = xDoc.Element(CONFIG).
                           Element(thisMachine)

        Dim locals = xDoc.Element(CONFIG).
                          Element(COMMON)

        Dim item As XElement
        Dim section As XElement

        For Each kvp As KeyValuePair(Of String, SettingsItem) In myCol
            If kvp.Value.Roamer Then
                section = roamers
            Else
                section = locals
            End If

            item = section.Elements().
                        FirstOrDefault(Function(q) q.Attribute(ITEMNAME).Value = kvp.Key)

            If item Is Nothing Then
                ' found a new item
                Dim newItem = New XElement(SETTING)
                newItem.Add(New XAttribute(ITEMNAME, kvp.Value.Name))
                'newItem.Add(New XAttribute(SERIALIZE_AS, kvp.Value.SerializeAs))
                newItem.Value = If(String.IsNullOrEmpty(kvp.Value.Value), "", kvp.Value.Value)
                section.Add(newItem)
            Else
                If kvp.Value.Remove Then
                    item.Remove()
                Else
                    item.Value = If(String.IsNullOrEmpty(kvp.Value.Value), "", kvp.Value.Value)
                End If
            End If

        Next
        xDoc.Save(UserConfigFilePath)

    End Sub

    ' used in the XML
    Const CONFIG As String = "configuration"
    Const SETTING As String = "setting"
    Const COMMON As String = "CommonShared"
    Const ITEMNAME As String = "name"
    'Const SERIALIZE_AS As String = "serializeAs"

    ' https://stackoverflow.com/a/11398536
    Private Sub CreateNewConfig()
        Dim fpath = Path.GetDirectoryName(UserConfigFilePath)
        Directory.CreateDirectory(fpath)

        Dim xDoc = New XDocument
        xDoc.Declaration = New XDeclaration("1.0", "utf-8", "true")
        Dim cfg = New XElement(CONFIG)

        cfg.Add(New XElement(COMMON))
        cfg.Add(New XElement(thisMachine))

        xDoc.Add(cfg)
        xDoc.Save(UserConfigFilePath)
    End Sub

End Class

这是很多代码,只是为了从路径中删除证据哈希,但这是 MS 推荐的。这也可能是唯一的方法:ConfigurationManager其获取的文件是只读的并且由代码支持。

Results:

实际的 XML 如前面所示,包含本地/通用和计算机特定部分。我使用了几个不同的应用程序名称并进行了各种测试:

enter image description here

忽略版本部分。如前所述,该内容已被删除。否则,文件夹是正确的 - 如上所述,当涉及到 AppName 段时,您有一些选项。

重要笔记

  • 除非相关应用程序访问 Settings 属性,否则不会调用提供程序中的 Load 方法
  • 加载后,无论代码是否更改任何内容,应用程序结束时都会调用 Save 方法(使用 VB 框架)
  • NET 似乎只保存与默认值不同的设置。使用自定义提供程序时,所有值都会被标记IsDirty为真且UsingDefaultValue为假。
  • 如果/加载时,将返回所有值,并且 NET 在应用程序的整个生命周期中简单地从该集合中获取值

我主要关心的是类型的正确转换和本地/漫游支持。我没有检查每一个可能的类型。特别是自定义类型和枚举(我知道枚举需要额外的处理)。


值得注意的是,使用DataTable使这个much更简单。您不需要SettingsItem类、集合、无 XDoc(使用.WriteXML / .ReadXml)。所有创建和组织 XElement 的代码也都消失了。

生成的 XML 文件有所不同,但这只是函数后面的形式。一共可以去掉60行左右的代码,而且更加简单。

资源

  • 设置提供者类
  • 有关设置的 MSDN 博客条目
  • 堆栈溢出:user.config 的自定义路径“Chuck”使用更好命名的暂存变量
  • 堆栈溢出:XML 中的 MachineName 问题
  • 直到完成后我才看到这篇 CodeProject 文章:创建自定义设置提供程序这似乎是根据每个设置使用自定义提供程序的不同方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何更改 .NET 应用程序的预定义 userconfig 目录? 的相关文章

  • C# 处理标准输入

    我目前正在尝试通过命令行断开与网络文件夹的连接 并使用以下代码 System Diagnostics Process process2 new System Diagnostics Process System Diagnostics Pr
  • C 中“complex”的默认类型

    根据我读过的文档 C99 和更高版本的支持float complex double complex and long double complex作为复杂类型 但是 此代码在使用时编译时不会发出警告gcc Wall Wextra inclu
  • 全局使用和 .NET Standard 2.0

    我最近意识到我可以使用 C 10 功能文件范围的命名空间在 NET Standard 2 0 项目中也可以通过设置
  • 将日期时间转换为指定格式

    我有这个日期格式yy MM dd HH mm ss ex 12 02 21 10 56 09 问题是 当我尝试使用以下代码将其转换为不同格式时 CDate 12 02 21 10 56 09 ToString MMM dd yyyy HH
  • C# 编译器数字文字

    有谁知道 C 编译器数字文字修饰符的完整列表 默认情况下 声明 0 使其成为 Int32 声明 0 0 使其成为 Double 我可以在末尾使用文字修饰符 f 来确保某些内容被视为 Single 例如像这样 var x 0 x is Int
  • 静态类与类的实例

    我有一个静态类 用于访问我的公共属性 整个应用程序的全局属性 和我在应用程序运行期间使用的方法 例如 我在静态类中设置了一些属性 并且在应用程序运行时我可以从属性中获取值 但我可以使用单例模式创建非静态类并以相同的方式使用它 问题 对于我的
  • 数据读取过程中遇到致命错误

    我正在进行定期更新表扫描 Using connect1 As New MySqlConnection ConnectLocalhost serverString connect1 Open Dim cmd New MySqlCommand
  • 时间:2019-03-17 标签:c++fstream并发访问

    如果从不同的进程 线程同时访问文件会发生什么 据我所知 没有锁定文件的标准方法 只有操作系统特定的功能 就我而言 文件将被经常读取而很少写入 现在如果A打开一个文件进行读取 ifstream 并开始读取块 和B打开相同的文件进行写入 ofs
  • Resharper:IEnumerable 的可能多重枚举

    我正在使用新的 Resharper 版本 6 在我的代码中的几个地方 它给一些文本加了下划线 并警告我可能存在IEnumerable 可能的多重枚举 我理解这意味着什么 并在适当的情况下采纳了建议 但在某些情况下 我不确定这实际上是一个大问
  • 如何在 C# 中获取 Json 数组?

    我有一个像这样的 Json 字符串 我想将它加载到 C 数组中 当我尝试这样做时 我收到异常 我的字符串 customerInformation customerId 123 CustomerName Age 39 Gender Male
  • ALTER TABLE ... ADD CONSTRAINT 失败时将事务回滚到保存点

    有没有办法在事务中添加检查约束and如果失败回滚到以前的保存点 而不是回滚整个事务 就我而言 当 ALTER TABLE ADD CONSTRAINT 命令失败时 事务无法回滚到保存点 尝试这样做会引发 InvalidOperationEx
  • EnumDisplayDevices 与 WMI Win32_DesktopMonitor,如何检测活动监视器?

    对于我当前的 C 项目 我需要为在大量计算机上连接并处于活动状态的每个监视器检测一个唯一的字符串 研究指出了两种选择 使用 WMI 并查询 Win32 DesktopMonitor 以获取所有活动监视器 使用 PNPDeviceID 来唯一
  • 如何在网页上实现文件上传进度条?

    当用户将文件上传到我的网络应用程序时 我想显示比动画 gif 更有意义的内容 我还有哪些可能性 编辑 我正在使用 Net 但我不介意是否有人向我展示与平台无关的版本 如果您对这一切在客户端通常如何工作感兴趣 就是这样 所有解决方案都通过 J
  • 无法在 C# 中为 EventArgs 分配使用派生类型的事件处理程序

    所以我有一个事件声明如下 public event EventHandler OnChangeDetected 然后我有以下处理程序被分配给该事件 myObject OnChangeDetected OnTableChanged 我的理解是
  • Autoconf 问题:“错误:C 编译器无法创建可执行文件”

    我正在尝试使用 GNU 自动工具构建一个用 C 编写的程序 但显然我设置错误 因为当configure运行 它吐出 configure error C compiler cannot create executables 如果我看进去con
  • 使用 Group By LINQ 语句时 VB.NET 返回 IEnumerable(Of IEnumerable(Of T))

    我正在尝试转换安西姆 凯拉德INotifyDataErrorInfo执行 http burnaftercoding com post asynchronous validation with wpf 4 5 进入VB NET 一切顺利 直到
  • 有没有办法直接在函数参数中格式化字符串而不是使用临时字符串?

    我有一个接受字符串 字符数组 作为参数的函数 void enterString char my string 当使用这个函数时 我经常发现自己想要输入格式化的字符串 我使用 sprintf 来做到这一点 然而 我每次都必须创建一个临时字符串
  • 无法识别解决方案文件夹中的 Visual Studio 2017 Nuget.config

    我在使用 Visual Studio 2017 时遇到问题 新的解决方案不断引用 C Users yopa AppData Roaming NuGet Nuget config 中意外位置的 Nuget config 文件 我已将 nuge
  • 如何提高环复杂度?

    对于具有大量决策语句 包括 if while for 语句 的方法 循环复杂度会很高 那么我们该如何改进呢 我正在处理一个大项目 我应该减少 CC gt 10 的方法的 CC 并且有很多方法都存在这个问题 下面我将列出一些例如我遇到的问题的
  • 为什么表达式 a = a + b - ( b = a ) 在 C++ 中给出序列点警告?

    以下是测试代码 int main int a 3 int b 4 a a b b a cout lt lt a lt lt a lt lt lt lt b lt lt b lt lt n return 0 编译此命令会出现以下警告 gt g

随机推荐

  • 如何在 > 4 GiB 的地址范围内进行 malloc

    我正在尝试在 X86 64 Linux 上做一些测试 我想知道如何 让 malloc 在高于 4 GiB 的范围内分配返回地址 我是否必须使用单独 自定义库覆盖 malloc 或者还有其他简单的方法可以做到这一点吗 Thanks 编辑 我感
  • jQuery Draggable - 如果它对一个元素应用两次会发生什么?

    直到最近我才进行了这样的设置 它被多次调用 rsh draggable destroy draggable blah blah details The destroy是为了阻止多个可拖动处理程序在类上累积 AJAX 正在创建新元素 并且初始
  • NSScrollView 调整大小时向下滚动?

    我有一个 NSScrollView 里面有一个自定义视图 当我调整 NSScrollView 的大小时 高度会增加并且向上滚动 除非有更简单的方法 否则我可能必须注册一个通知以查看视图大小是否发生变化 然后将scrollPoint 调整到新
  • 如何将切换开关与 django 布尔字段一起使用?

    我有一个 work experience 模型 其中包含 is working 字段 当用户仍在公司工作时 该字段是正确的 在前端 我使用切换开关 我想在单击时更改布尔字段值 is working 在django中使用toggle的逻辑应该
  • Firestore:如何从数组映射中查询数据

    这是测试数据库的架构 我想编写一个查询 可以获取联系人在任何数组索引中 id 1 的所有文档 我检查过array containsFirestore 的运算符 但我的数组有一个地图 然后有字段 id 您当前无法构建在数组中查找对象字段的查询
  • 责任链模式是否只是一种矫枉过正?处理程序列表可以完成相同的任务

    在 责任链 COR 模式中 我们创建一个处理程序链 将请求传递给链中的第一个 它试图处理它 如果不能 它将请求转发到链中的下一个 依此类推 例如 Handler1 new ConcreteHandler1 handler1 handle p
  • 将值分配给向量中的行

    我有一个相对简单的问题 我和我的同事都无法弄清楚 我有一个值向量 我想将其粘贴到其中all我的数据集中的行在特定列范围内 如果我逐行分配值 则以下代码有效 data 1 1 10 lt myvector data 2 1 10 lt myv
  • 如何在一张背景图像上移动玩家?

    抱歉最近问了这么多问题 我刚刚开始接触 pygame 对于我之前的问题 我认为我没有正确地表达我想要做的事情 这是我尝试演示的一张快速图片 这是我希望玩家在其上移动的单个背景图像或地图 红色 X 只是角色的起点 我尝试做到这一点 以便当我移
  • 将缺失的日期添加到数组中

    我有以下数组 Array 2010 10 30 gt 1 2010 11 11 gt 1 2010 11 13 gt 11 我试图用第一个元素和最后一个元素之间所有缺失的日期填充数组 我尝试使用以下内容但无济于事 foreach users
  • Django/Postgres:RangeField 上的聚合

    是否可以执行聚合函数Django s RangeField 假设我们有 3 个对象BigIntegerField price range 第一个对象 price range 10 5000 第二个目标 price range 1 5000
  • 混合 TensorFlow 和 TensorFlow 联合代码的推荐方法是什么?

    TensorFlow TF 和 TensorFlow Federated TFF 是不同的功能层 旨在很好地协同工作 顾名思义 尽管如此 它们还是不同的东西 旨在解决不同的问题 我想知道以一种可以在普通 TF 和 TFF 工作负载中使用的方
  • 打开多个文件并对所有打开的文件执行宏

    我想编写一个宏来打开 30 个具有相同结构的 Excel 文件 宏应该对所有文件进行操作 并将每个文件的结果放入另一个 Excel 文件中 这意味着 所有结果 值 将被复制到目标文件中 如何编写VBA代码来打开多个文件 如何从每个文件中获取
  • UWP 命令栏更多按钮未显示 DynamicOverflowEnabled

    我有一个正在使用的 UWP 应用程序自定义媒体传输控件 在这些控件中 我在命令栏中添加了一些额外的按钮主要命令并已设定IsDynamicOverflowEnabled true根据文档 当屏幕尺寸不足以容纳所有按钮时 它应该自动将主要命令发
  • 如何提高应用程序的 Feed 操作请求限制? [关闭]

    Closed 这个问题是无关 目前不接受答案 我正在尝试提高应用程序的限制 因为在大约 50 个请求之后 应用程序将变得无法运行 我怎样才能做到这一点 这是错误 致命错误 未捕获的 OAuthException 341 已达到 Feed 操
  • 块 - 大括号/无大括号? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 当我开始开发时 我遵循了始
  • JS 将字符串转换为多维对象键

    我有一个字符串 例如 convert lamp stamp glass nose 我想创建一个对象键 鼻子 坦克对象已经创建 tank convert lamp stamp glass nose 我该怎么做呢 我使用 split 得到了数组
  • 在 Inno Setup 中从 Internet 安装文件

    我正在使用 Inno Setup 来分发我的应用程序 是否可以检查 Inno Script 的特定条件 并根据需要从互联网下载并安装一些文件 创新设置6 1较新的版本具有内置的下载支持 不再需要第三方解决方案 检查Examples Code
  • Google Chrome 扩展程序登录功能

    我正在开发一个 Chrome 扩展程序 我正在努力实现这一目标 单击 chrome 扩展程序图标 您会看到一个简单的登录页面 输入您的凭据 我需要将它们发送到 REST API 该 API 具有一个登录方法 该方法将返回我需要的 API 密
  • 将 Excel 工作簿另存为 HTML - 无法访问“System.IO.MemoryStream”

    我有一些代码想要将 Excel 电子表格转换为html所以我可以用它作为电子邮件的正文 Excel Application excel new Excel Application Excel Workbook workbook excel
  • 如何更改 .NET 应用程序的预定义 userconfig 目录?

    目前我的应用程序的用户设置存储在这个默认目录中 C Users User Name AppData Roaming Company Name Assembly Name vshos Url Hash Assembly Version 我知道