2

我有一个使用 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,所以如果有人知道避免这种情况的方法,请告诉我!

4

1 回答 1

1

谢谢你的帮助。我解决了这个问题。不知何故,.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")

这样它需要正确的配置文件

于 2012-11-26T22:22:30.300 回答