2012-11-22 41 views
2

我有一個使用Process.Start執行exe的應用程序。它適用於我測試過的所有.exe,除非.exe有一個配置文件,它在獲取連接字符串時發生這種情況,我得到一個System.NullReferenceException。這是我的代碼。Process.start上的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") 

得到一個連接字符串的第一件事,如果我用的ConnectionString替換此像這樣,它工作正常

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

我會刪除配置文件,並把它的v alues到.exe代碼中,但麻煩的是,我有超過500個使用配置文件的.exe文件,所以如果有人知道避免這種情況的方法,請告訴我!

+4

您必須將工作文件夾設置到.exe所在的同一文件夾 - 您的情況爲「c:\ temp \」 – t3hn00b

+0

嗨,感謝您的答案@ t3hn00b,但我仍然收到相同的錯誤 – user1843574

+0

假設您的連接字符串處於一個app.config文件是該文件也位於喲在工作文件夾中的可執行文件?你能夠從中讀取任何值而沒有異常,或只是在讀取連接字符串時? –

回答

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 

我呼叫改變功能的程序

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

這樣,它採取正確的配置文件的開頭