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コードに入れますが、問題は、設定ファイルを使用する.exeが500を超えることです。これを回避する方法を知っている人がいたら、教えてください。

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 に答える