2013-02-19 3 views
0
  1. Почему приложение стороннего разработчика ведет себя по-другому, если оно запускается из командной оболочки, чем при запуске из C# с использованием System.Diagnostics.Process.Start("ThirdPartyApp.exe");?Приложение .NET 4.0 бросает ApplicationException при запуске из другого приложения .NET 4.0 (C#)

  2. Есть ли способ запустить приложение на C# так, чтобы он выполнял точно, например, когда он запускается из командной оболочки?

Детали: У меня есть приложение, третья сторона .NET 4.0 (не исходный код) установлен и работает на моем компьютере. Он работает с веб-службами, работающими в IIS. Я написал приложение C#, которое использует SOAP-сообщения для вызова этих веб-сервисов. (Оба приложения установлены и запущены на одном ПК.) Если приложение сторонних разработчиков работает до запуска моего приложения, я могу общаться с ним без проблем. Если стороннее приложение не запускается до запуска моего приложения, я хочу, чтобы его можно было запустить. Я попытался следующий код:

if (!System.Diagnostics.Process.GetProcesses().Select(rec => rec.ProcessName).Contains("ThirdPartyApp")) 
{ 
    System.Diagnostics.Process.Start("ThirdPartyApp.exe"); 
} 

Если я затем попытаться получить доступ к веб-сервиса через мой SOAP клиента:

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, но второе сообщение об ошибке (System.ApplicationException: Object synchronization method was called from an unsynchronized block of code.) все еще появляется и остается неизменным.

Любая помощь в понимании того, что я делаю неправильно, и как я могу заставить это стороннее приложение вести себя одинаково независимо от того, запущено ли оно изнутри приложения C# или снаружи, будет с благодарностью!

ответ

2

Возможно, это связано с контекстом пользователя, в котором работает ваше приложение, например, если вы запустите приложение в качестве администратора, то Process.Start попытается запустить процесс в том же контексте.

И пожалуйста, напишите содержимое InvalidCastException

+0

Вы были совершенно правы. По-видимому, мое стороннее приложение сильно зависит от того, что рабочий каталог при запуске. Установка этого параметра в ProcessStartInfo решила мою проблему. Благодаря! –

+0

Удивительный, рад помочь вам! :) – animaonline

Смежные вопросы