サードパーティアプリケーションがコマンドシェル内から起動された場合と、を使用してC#アプリケーション内から起動された場合とで動作が異なるのはなぜ
System.Diagnostics.Process.Start("ThirdPartyApp.exe");
ですか?コマンドシェルから起動したときとまったく同じように動作するように、C#内でアプリケーションを起動する方法はありますか?
詳細: サードパーティの.NET 4.0アプリケーション(ソースコードはありません)がインストールされ、PCで実行されています。IISで実行されているWebサービスが付属しています。これらのWebサービスを呼び出すためにSOAPメッセージを使用するC#アプリケーションを作成しました。(両方のアプリケーションが同じPCにインストールされ、実行されています。)アプリを起動する前にサードパーティのアプリが実行されている場合、問題なく通信できます。アプリを起動する前にサードパーティのアプリが実行されていない場合は、起動できるようにしたいと思います。次のコードを試しました。
if (!System.Diagnostics.Process.GetProcesses().Select(rec => rec.ProcessName).Contains("ThirdPartyApp"))
{
System.Diagnostics.Process.Start("ThirdPartyApp.exe");
}
次に、SOAPクライアントを介してWebサービスにアクセスしようとすると、次のようになります。
using (var soapClient = new ThirdPartyAppSoapClient())
{
soapClient.SomeWebService();
}
の呼び出し時にSomeWebService
、サードパーティアプリは次の例外をスローします。
2013-02-18 19:43:33,884 [17] ERROR ThirdPartyApp.Manager Error Exception Caught
System.IO.FileNotFoundException: Could not load file or assembly 'file:///C:\Pro
gram Files (x86)\Common Files\Microsoft Shared\DevServer\10.0\ThirdPartyDependen
cy.dll' or one of its dependencies. The system cannot find the file specified.
File name: 'file:///C:\Program Files (x86)\Common Files\Microsoft Shared\DevServ
er\10.0\ThirdPartyDependency.dll'
at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String cod
eBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark&
stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppre
ssSecurityChecks)
at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName as
semblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntr
ospection, Boolean suppressSecurityChecks)
at System.Reflection.RuntimeAssembly.InternalLoadFrom(String assemblyFile, Ev
idence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm,
Boolean forIntrospection, Boolean suppressSecurityChecks, StackCrawlMark& stackM
ark)
at System.Reflection.Assembly.LoadFrom(String assemblyFile)
at ...
WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLM\Software\M
icrosoft\Fusion!EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with assembly bind failure lo
gging.
To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fus
ion!EnableLog].
Unhandled Exception: System.ApplicationException: Object synchronization method
was called from an unsynchronized block of code.
at System.Threading.Mutex.ReleaseMutex()
at ...
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, C
ontextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, C
ontextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
SomeWebService
アプリケーションを起動する前にサードパーティのアプリケーションがすでに実行されていれば、問題なく呼び出すことができるので、依存関係が欠落しているとは信じがたいです。しかし、このサードパーティ製アプリをユーモアを交えて、不足しているファイルを指定されたフォルダーにコピーして、問題が解決するかどうかを確認しました。依存関係の欠落に関する最初のエラーメッセージはInvalidCastExceptionに変わりますが、2番目のエラーメッセージ(System.ApplicationException: Object synchronization method was called from an unsynchronized block of code.
)は引き続き表示され、変更されません。
私が間違っていることを理解し、このサードパーティ製アプリをC#アプリの内部から起動したか外部から起動したかに関係なく、同じように動作させる方法を理解するための助けをいただければ幸いです。