gpt4 book ai didi

c# - Process.start 处的 System.NullReferenceException

转载 作者:太空宇宙 更新时间:2023-11-03 13:51:47 24 4
gpt4 key购买 nike

我有一个使用 Process.Start 来执行 exe 的应用程序。它适用于我测试过的所有 .exe,除非 .exe 有一个获取连接字符串的配置文件,当发生这种情况时,我得到一个 System.NullReferenceException。这是我的代码。

执行exe:

string eucApp = @"C:\Temp\app.exe"
startInfo = new ProcessStartInfo(eucApp);
using (Process execProcess = Process.Start(startInfo))
{
execProcess.WaitForExit();
}

然后 exe 启动,第一件事就是使用此代码行获取连接字符串

strCadena = ConfigurationManager.ConnectionStrings("ConnectionString")

如果我用这样的连接字符串替换它,它工作正常

strCadena = "Data Source=HostName;Initial Catalog=MyDB;Integrated security=True"

我会删除配置文件并将其值放入 .exe 代码中,但问题是我有超过 500 个使用配置文件的 .exe,所以如果有人知道避免这种情况的方法,请告诉我!

最佳答案

感谢您的帮助。我解决了这个问题。 .exe 以某种方式指向启动进程的应用程序的 app.config。我把这个类添加到用VB .Net 开发的.exe

Imports System.Configuration
Imports System.Reflection
Public Class AppConfig
Implements IDisposable
Public Shared Function Change(ByVal path As String) As AppConfig

Return New ChangeAppConfig(path)
End Function
Public Overridable Sub Dispose() Implements IDisposable.Dispose
End Sub
Private Class ChangeAppConfig
Inherits AppConfig
Private ReadOnly oldConfig As String = AppDomain.CurrentDomain.GetData("APP_CONFIG_FILE").ToString
Private disposedValue As Boolean
Public Sub New(ByVal path As String)
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", path)
ResetConfigMechanism()
End Sub
Public Overrides Sub Dispose()
If (Not disposedValue) Then
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", oldConfig)
ResetConfigMechanism()
disposedValue = True
End If
GC.SuppressFinalize(Me)
End Sub
Private Shared Sub ResetConfigMechanism()

GetType(ConfigurationManager).GetField("s_initState", BindingFlags.NonPublic Or BindingFlags.Static).SetValue(Nothing, 0)
GetType(ConfigurationManager).GetField("s_configSystem", BindingFlags.NonPublic Or BindingFlags.Static).SetValue(Nothing, Nothing)
Dim assemblies() As Type = GetType(ConfigurationManager).Assembly.GetTypes()
For Each assembly As Type In assemblies
If (assembly.FullName = "System.Configuration.ClientConfigPaths") Then
assembly.GetField("s_current", BindingFlags.NonPublic Or BindingFlags.Static).SetValue(Nothing, Nothing)
Exit For
End If
Next
End Sub
End Class
End Class

我在程序开始时调用了Change函数

AppConfig.Change(Application.StartupPath & "\app.exe.Config")

通过这种方式获取正确的配置文件

关于c# - Process.start 处的 System.NullReferenceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13516232/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com