BadImageFormatException в службе

У меня есть приложение, которое является давно работающей службой, я недавно переписал его, чтобы использовать плагины и домены приложений для решения проблемы с памятью, которая оказалась не моей, а утечкой в ​​​​пространстве имен Microsoft DirectoryServices, не позволяющем должным образом удалять вещи. После моей перезаписи я больше не могу запускать приложение как службу, хотя в консольном режиме оно работает нормально. При попытке запустить приложение я получаю следующее исключение в журнале событий Windows:

Application: ADImport.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.BadImageFormatException
Stack:
   at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoadFrom(String assemblyFile, Evidence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm, Boolean forIntrospection, Boolean suppressSecurityChecks, StackCrawlMark& stackMark)
   at System.Reflection.Assembly.LoadFrom(String assemblyFile)
   at ADImportPlugIn.LoadAssemblyAttributesProxy.LoadAssemblyAttributes(String assFile)
   at ADImportPlugIn.LoadAssemblyAttributesProxy.LoadAssemblyAttributes(System.String)
   at ADImportPlugIn.PlugInLoader.GetAssemblyNames()
   at ADImportPlugIn.PlugInLoader.LoadAllPlugIns()
   at ADImport.Program.WorkerMethod()
   at System.Threading.ThreadHelper.ThreadStart_Context(System.Object)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
   at System.Threading.ThreadHelper.ThreadStart()

Я искал здесь и видел много потоков о разрядности приложения и возможных несоответствиях между приложением и связанными DLL/сборками. Я все проверил, пытался настроить таргетинг на определенные платформы и т. д., но ничего не работает. Моя платформа разработки — 64-битная Windows 7, цель — 64-битная Windows 2008. Мое приложение настроено на x86, мои сборки - anycpu, хотя я пытался установить их также x86, x64 и т. д. Я использую log4net в одной из моих DLL, но не думаю, что это проблема.

Любая помощь будет оценена по достоинству!


person Richard    schedule 21.06.2012    source источник
comment
Попробуйте установить приложение на AnyCpu...   -  person Marco    schedule 21.06.2012
comment
LoadAllPlugIns — опасное имя. Вы вообще фильтруете или просто ищете и собираете любую DLL, которую найдете? Отлавливайте исключения, добавляйте логирование.   -  person Hans Passant    schedule 21.06.2012
comment
@hans Я фильтровал, но фильтровал не в том каталоге! Спасибо за подсказку, это позволило мне найти решение... оно было в моей сборке загрузчика плагинов.   -  person Richard    schedule 21.06.2012


Ответы (1)


Как отмечалось выше, я фильтровал, но делал это неправильно. У меня есть сборка, которая использовала

string[] fileNames = Directory.GetFiles(Environment.CurrentDirectory, "*.dll");

И мне нужно было изменить его на:

string[] fileNames = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.dll");

Забыв, что, поскольку это служба Windows, текущий каталог находится не там, где установлено приложение, а в Windows\System32. Дох.

person Richard    schedule 21.06.2012