У меня есть приложение, которое работает в большинстве систем Windows 10 (64-разрядная версия), но есть 6 компьютеров, которые получают такое же исключение BadImageFormatException. Приложение и библиотеки ориентированы на AnyCPU. При попытке создать COM-объект из сборки получаю исключение:
Не удалось загрузить файл или сборку «InfoConnectCOM.Wrapper64.dll» или одну из ее зависимостей. не является приложением Win32. (Исключение из HRESULT: 0x800700C1)
Судя по названию оболочки, похоже, что она должна ссылаться на сборки x64. Недавно было 30 компьютеров с таким же изображением, и только у 6 была эта проблема. Кроме того, существует несколько сотен других компьютеров с Win10 (64-разрядная версия), на которых эта проблема не возникает.
Private _system As Object
Private Const IC16AssemblyName As String = "InfoConnectCOM.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=13bff1b6907eadcf"
Private Sub CreateIC16SystemObject()
Dim assembly As Reflection.Assembly = Reflection.Assembly.Load(IC16AssemblyName)
Dim type As System.Type = assembly.GetType("Accmgr.AccmgrSystemWrapper")
_system = Activator.CreateInstance(type)
End Sub
Сборка загружается динамически, так как мне нужен код для работы с разными версиями ПО на разных платформах.
Stacktrace System.Reflection.TargetInvocationException
System.RuntimeTypeHandle.CreateInstance(type As RuntimeType, publicOnly As Boolean, noCheck As Boolean, canBeCached As Boolean&, ctor As RuntimeMethodHandleInternal&, bNeedSecurityCheck As Boolean&)
QCC.exe: N 00000
System.RuntimeType.CreateInstanceSlow(publicOnly As Boolean, skipCheckThis As Boolean, fillCache As Boolean, stackMark As StackCrawlMark&)
QCC.exe: N 00142
System.Activator.CreateInstance(type As Type, nonPublic As Boolean)
QCC.exe: N 00105
System.Activator.CreateInstance(type As Type)
QCC.exe: N 00012
IAT.AccMgr.Session.CreateIC16SystemObject()
QCC.exe: N 00060
IAT.AccMgr.Session.CreateSystemObject()
QCC.exe: N 00029
IAT.AccMgr.Session..ctor()
QCC.exe: N 00163
Трассировка стека BadImageFormatException
System.Reflection.RuntimeAssembly._nLoad(fileName As AssemblyName, codeBase As String, assemblySecurity As Evidence, locationHint As RuntimeAssembly, stackMark As StackCrawlMark&, pPrivHostBinder As IntPtr, throwOnFileNotFound As Boolean, forIntrospection As Boolean, suppressSecurityChecks As Boolean)
QCC.exe: N 00000
System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(assemblyRef As AssemblyName, assemblySecurity As Evidence, reqAssembly As RuntimeAssembly, stackMark As StackCrawlMark&, pPrivHostBinder As IntPtr, throwOnFileNotFound As Boolean, forIntrospection As Boolean, suppressSecurityChecks As Boolean)
QCC.exe: N 00457
System.Reflection.RuntimeAssembly.InternalLoadFrom(assemblyFile As String, securityEvidence As Evidence, hashValue As Byte[], hashAlgorithm As AssemblyHashAlgorithm, forIntrospection As Boolean, suppressSecurityChecks As Boolean, stackMark As StackCrawlMark&)
QCC.exe: N 00182
System.Reflection.Assembly.LoadFrom(assemblyFile As String, securityEvidence As Evidence)
QCC.exe: N 00056
System.Activator.CreateInstanceFromInternal(assemblyFile As String, typeName As String, ignoreCase As Boolean, bindingAttr As BindingFlags, binder As Binder, args As Object[], culture As CultureInfo, activationAttributes As Object[], securityInfo As Evidence)
QCC.exe: N 00029
Accmgr.AccmgrSystemWrapper.CreateAccmgrSystemWrapper(installDir As String)
QCC.exe: N 00086
Accmgr.AccmgrSystemWrapper..ctor()
QCC.exe: N 00045
Мы пытались удалить и переустановить программное обеспечение InfoConnect. Если я изменю свой код и библиотеки на x86, тогда он запустится. Но я бы хотел избежать перекомпиляции всего программного обеспечения для платформы x86.
Любые идеи о том, как продолжить устранение неполадок или почему это затронет только небольшое количество компьютеров?
Спасибо