Все эти проверки ничего не меняли. Я включил полный текст информации об исключениях ниже, при этом некоторые имена изменены, чтобы защитить секреты моих корпоративных хозяев.
System.BadImageFormatException был необработан. Сообщение = Не удалось загрузить файл или сборку «XxxDevices, Версия = 1.0.0.0, Культура = нейтральный, PublicKeyToken = null» или одну из их зависимостей. Была сделана попытка загрузить программу с неверным форматом.
Источник = XxxDevicesService Имя файла = XxxDevices, Версия = 1.0.0.0, Культура = нейтральный, PublicKeyToken = null FusionLog = Диспетчер сборки загружается из: C: Windows Microsoft.NET Framework64 v4.0.30319 clr.dll Запускается под исполняемым файлом c: Dev TeamE bin Release XxxDevicesService.vshost.exe — Подробный журнал ошибок следует ниже. === Информация о состоянии предварительной привязки === LOG: User = XXX LOG: DisplayName = XxxDevices, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null (полностью указан) LOG: Appbase = file: /// c : / Dev / TeamE / bin / Release / LOG: Initial PrivatePath = NULL Вызывающая сборка: XxxDevicesService, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null. === LOG: Эта привязка запускается в контексте загрузки по умолчанию. LOG: использование файла конфигурации приложения: c: TeamE bin Release XxxDevicesService.vshost.exe.Config LOG: использование файла конфигурации хоста: LOG: использование файла конфигурации компьютера из C: Windows Microsoft.NET Framework64 v4.0.30319.
Террария решаем ошибки | Terraria error
0 config machine.config. ЖУРНАЛ: Политика не применяется к ссылке в настоящее время (частная, настраиваемая, частичная или привязка сборки на основе местоположения). ЖУРНАЛ: Попытка загрузки нового файла URL: /// c: /TeamE/bin/Release/XxxDevices.DLL. ОШИБКА: не удалось завершить настройку сборки (hr = 8007000xXNUMXb). Зондирование прекращено.
StackTrace: в XxxDevicesService.Program.Main (String [] args) в System.AppDomain._nExecuteAssembly (сборка RuntimeAssembly, String [] args) в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly () в System.Threading.Execution ( ExecutionContext ExecutionContext, обратный вызов ContextCallback, состояние объекта, логическое значение ignoreSyncCtx) в System.Threading.ExecutionContext.Run (ExecutionContext executionContext, обратного вызова ContextCallback, состояние объекта) в System.Threading.ThreadHelper.ThreadStart () InnerException:
вы вообще смешиваете нативный код / .net? — Keith Nicholas
Вы находитесь на правильном пути, поскольку это исключение связано с различиями в битах x86 / x64. Я полагаю, это не веб-приложение, верно? Также какой тип сборки XxxDevicesService ? Скомпилирован ли он для конкретной платформы (например, 32-битной)? Если это так, то вы должны скомпилировать свою платформу до 32-разрядной версии. — Reddog
21 ответы
Проверенные настройки сборки, такие как Platform Target, одинаковы (x86).
Это не то, о чем говорится в журнале сбоев:
1с предприятие не запускается неверный формат хранилища данных
Диспетчер сборки загружается из: C: Windows Microsoft.NET Framework64
Обратите внимание 64 в названии — это дом 64-битной версии фреймворка. Установите настройку целевой платформы на вашем EXE проект, а не проект библиотеки классов. Проект XxxDevicesService EXE определяет разрядность процесса.
Источник: stackovergo.com
Badimageformatexception была сделана попытка загрузить программу имеющую неверный формат
Регистрация: 24.06.2008
Адрес: Россия, Москва
Пишу веб-приложение, которое подключается к CRM 4 и достает оттуда данные. Паблишу приложение на сервер и при запуске получаю вот такую ошибку:
Невозможно загрузить файл или сборку «microsoft.crm.sdk» или один из зависимых от них компонентов. Была сделана попытка загрузить программу, имеющую неверный формат. Трассировка стека: [BadImageFormatException: Невозможно загрузить файл или сборку «microsoft.crm.sdk» или один из зависимых от них компонентов. Была сделана попытка загрузить программу, имеющую неверный формат.] System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark stackMark, Boolean forIntrospection) +416 System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMarkmicrosoft.crm.sdk» или один из зависимых от них компонентов. Была сделана попытка загрузить программу, имеющую неверный формат.] System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +11224200 System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() +388 System.Web.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai) +232 System.Web.Configuration.AssemblyInfo.get_AssemblyInternal() +48 System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) +210 System.Web.Compilation.WebDirectoryBatchCompiler..ctor(VirtualDirectory vdir) +191 System.Web.Compilation.BuildManager.BatchCompileWebDirectoryInternal(VirtualDirectory vdir, Boolean ignoreErrors) +54 System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath) +295 System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile) +476 System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile) +116 System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean noAssert) +175 System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(VirtualPath virtualPath, Type requiredBaseType, HttpContext context, Boolean allowCrossApp, Boolean noAssert) +52 System.Web.UI.PageHandlerFactory.GetHandlerHelper(HttpContext context, String requestType, VirtualPath virtualPath, String physicalPath) +50 System.Web.HttpApplication.MapHttpHandler(HttpContext context, String requestType, VirtualPath path, String pathTranslated, Boolean useAppConfig) +503 System.Web.MapHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +142 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Booleanhttps://axforum.info/forums/showthread.php?t=38809″ target=»_blank»]axforum.info[/mask_link]
Подключение фортрановской LAPACK x64 в x64 проект на C#
Имеется фортрановская библиотека LAPACK — пакет работы с линейной алгеброй. Конкретно в данный момент интересует её функция DGTSV (метод прогонки для трёхдиагональных матриц). Её сигнатура в фортране такая:
subroutine dgtsv ( integer N, integer NRHS, double precision, dimension( * ) DL, double precision, dimension( * ) D, double precision, dimension( * ) DU, double precision, dimension( ldb, * ) B, integer LDB, integer INFO )
В компонентном паскале (он только 32-bit, поэтому версия LAPACK — тоже 32-bit) я подключал LAPACK таким образом (звездочка имеет смысл метки для видимости извне, аналог public в C#):
MODULE LinalgLAPACK [«liblapack.dll»]; PROCEDURE DGTSV* [«dgtsv_»] (VAR n : LAPACK_Integer; VAR nrhs : LAPACK_Integer; VAR dl : Double; VAR d : Double; VAR du : Double; VAR b : Double; VAR ldb : LAPACK_Integer; VAR info : LAPACK_Integer);
Тут есть нюанс — liblapack.dll требует libblas.dll, а еще libgfortran-3.dll, libgcc_s_dw2-1.dll и libquadmath-0.dll. Все они — 32-битные. Зависимости исследовались Dependency Walker’ом.
Поскольку в фортране ВСЕ аргументы передаются ТОЛЬКО по ссылке, поэтому аргументы-указатели на массивы заменены на ссылки на начальные элементы массивов. В основном модуле вызов выглядел так:
MODULE LinalgTest; IMPORT LAPACK := LinalgLAPACK; . PROCEDURE Test*; VAR size, nrhs, info : INTEGER; c0, c1, c2, v : POINTER TO ARRAY OF REAL; BEGIN size := 3; nrhs := 1; NEW (c0, size); NEW (c1, size); NEW (c2, size); NEW (v, size); . LAPACK.DGTSV (size, nrhs, c0[1], c1[0], c2[0], v[0], size, info); END Test;
Главная диагональ имеет длину size, над- и под- диагонали — соответственно size-1. Во избежание смещения индексов используется маленькая хитрость: по ссылке (а фортрановская DGTSV интерпретирует сcылку как указатель) передается элемент с индексом 1 из массива длиной size, а не элемент с индексом 0 из массива длиной size — 1. И все прекрасно работает.
Теперь пытаюсь проделать то же в C#. Используя скомпилированные в x64 .dll библиотеки — это x64 версия liblapack.dll, которая явно требует x64 версии libblas.dll, а неявно еще и libgfortran_64-3.dll, libgcc_s_seh_64-1.dll, libquadmath-0.dll, решил разобраться с простым консольным x64 приложением на C#.
using System; using System.Runtime.InteropServices; namespace Linalg < class Program < [DllImport(«liblapack.dll», CharSet = CharSet.Ansi, SetLastError = true)] public static extern void dgtsv_(in int size1, in int nrhs, in double c0, in double c1, in double c2, in double v, in int size2, out int info); static void Main(string[] args) < int size = 3; int nrhs = 1; double[] c0 = new double[] < 0.0, 1.0, 0.0 >; double[] c1 = new double[] < 1.0, -2.0, 1.0 >; double[] c2 = new double[] < 0.0, 1.0, 0.0 >; double[] v = new double[] < 1.0, 2.0, 3.0 >; int info = 0; dgtsv_(in size, in nrhs, in c0[1], in c1[0], in c2[0], in v[0], in size, out info); Console.WriteLine(«info = «, info); > > >
При запуске — System.BadImageFormatException: «Была сделана попытка загрузить программу, имеющую неверный формат. (0x8007000B)»
Диспетчер конфигураций:
Весь проект:
Люди, добрые — что не так? )))
Ответы (3 шт):
Кажется, я таки допинал C# и OpenBLAS. Малой кровью получилось с Visual Studio 2010 (32-битная версия). Пример реально работающей программы с 32-битными OpenBLAS и с референсными BLAS/LAPACK (пример честно стащил отсюда и совсем немного подправил название библиотеки):
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices; namespace VAK_lapack_test < class MainClass < //[DllImport(«liblapack.dll», EntryPoint = «dgesv_»)] [DllImport(«libopenblas.dll», EntryPoint = «dgesv_»)] static extern void lapack_dgesv(ref int n, ref int nrhs, double[] a, ref int lda, int[] ipvt, double[] b, ref int ldb, ref int infos); public static void Main(string[] args) < // 5X — 2Y = 7 // -X + Y = 1 double[] a = < 5, -1, -2, 1 >; double[] b = < 7, 1 >; int n = 2; int nrhs = 1; int lda = 2; int ldb = 2; int infos0 = 0; var a0 = a.ToArray(); var b0 = b.ToArray(); int[] ipvt0 = new int[n]; lapack_dgesv(ref n, ref nrhs, a0, ref lda, ipvt0, b0, ref ldb, ref infos0); Console.WriteLine(«Equations»); Console.WriteLine(«5X — 2Y = 7»); Console.WriteLine(«-X + Y = 1»); Console.WriteLine(); Console.WriteLine(«Solutions netlib lapack»); //Console.WriteLine($»X = and Y = «); Console.WriteLine(«X = and Y = «, b0[0], b0[1]); Console.WriteLine(); > > >
И самое главное. Это работает только с моими специально обученными библиотеками. Специальная обученность их заключается в том, что они собраны с помощью MinGW GCC 4.9 (Об особенностях этой версии можно немного почитать в официальном документе How to use OpenBLAS in Microsoft Visual Studio; но там не говорится, что это единственная возможность. Как я писал, это просто самый простой вариант в моих условиях).
Для 32-битных версий, теоретически, можно использовать динамические библиотеки от MinGW с верисями, новее чем gcc 4.7, но у меня почему-то это не вышло с более новыми версиями (имеются ввиду, версии MinGW GCC, которым я собирал библиотеку OpenBLAS). А вот для 64-битной версии, как я понял, других вариантов нет — библиотеки нужно собирать в самом Visual Studio.
Теперь, когда есть работающий пример, можно начинать искать набор библиотек, совместимых с VS (можно попробовать вот отсюда — я не пробовал, это Яндекс подсказывает; но это оригинальные библиотеки с Netlib.org, а не OpenBLAS).
Сначала в VS2019 добавляем поддержку C++. Он в процессе потребуется и без файла vcvars64.bat не обойтись.
Все операции я проводил в корне C: — у меня это SSD. Создал папку C:opt — она потребуется в дальнейшем. Распаковал архив с OpenBLAS и переименовал его в C:OpenBLAS. Запускаем консоль анаконды «Anaconda Prompt (Miniconda3)» — я её запустил с правами администратора, на всякий — во избежание возможных проблем с правами на запись. Переходим в консоли в папку с OpenBLAS’ом:
cd cd openblas
В консоли отображается
(base) C:OpenBLAS>
Все команды вводим в консоли. Поехали!
conda update -n base conda conda config —add channels conda-forge conda install -y cmake flang clangdev perl libflang conda install -y -c isuruf kitware-ninja
«C:Program Files (x86)Microsoft Visual Studio2019CommunityVCAuxiliaryBuildvcvars64.bat»
Создаем в C:OpenBLAS .bat-файл с таким содержимым (опция -DBUILD_SHARED_LIBS=ON обязательна). Я назвал его zx.bat:
set «LIB=%CONDA_PREFIX%Librarylib;%LIB%» set «CPATH=%CONDA_PREFIX%Libraryinclude;%CPATH%» mkdir build cd build cmake .. -G «Ninja» -DCMAKE_CXX_COMPILER=clang-cl -DCMAKE_C_COMPILER=clang-cl -DCMAKE_Fortran_COMPILER=flang -DBUILD_WITHOUT_LAPACK=no -DNOFORTRAN=0 -DDYNAMIC_ARCH=ON -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Release
В консоли анаконды его запускаем:
Переходим к самому главному и самому долгому:
cmake —build . —config Release
После окончания компиляции завершаем всё командой:
cmake —install . —prefix c:opt -v
Забегая вперед — нужно ввести еще одну, самую последнюю команду 🙂
conda install libflang
Заходим в C:optbin и видим свежеиспечённую openblas.dll. В 64-битном Dependency walker’е (он проживает по адресу https://www.dependencywalker.com/) можно увидеть зависимости этой dll. Нужны оказываются ещё и некие flang.dll и flangrti.dll, а сама flang.dll потребует libomp.dll. После команды conda install libflang они как раз установятся и найти их можно в папке «C:Documents and SettingsAll UsersMiniconda3Librarybin».
Теперь запускаем Visual Studio 2019 (ну у кого что), создаем консольное приложение. В диспетчере конфигурации сразу выставляем платформу x64.
using System; using System.Runtime.InteropServices; namespace Linalg < class Program < [DllImport(«openblas.dll», EntryPoint = «dgtsv_»)] static extern void lapack_dgtsv(ref int n, ref int nrhs, double[] c0, double[] c1, double[] c2, double[] v, ref int ldb, ref int info); static void Main(string[] args) < int size = 3; int nrhs = 1; double[] c0 = new double[] < 1.0, 0.0, 0.0 >; double[] c1 = new double[] < 1.0, -2.0, 1.0 >; double[] c2 = new double[] < 0.0, 0.0, 1.0 >; double[] v = new double[] < 1.0, 2.0, 3.0 >; int info = 0; lapack_dgtsv (ref size, ref nrhs, c0, c1, c2, v, ref size, ref info); Console.WriteLine(«info = «, info); > > >
Всем большое спасибо за участие.
Выяснился еще один нюанс — в Компонентом Паскале (среда BlackBoox Component Builder) я использовал следующие конструкции.
PROCEDURE DGTSV* [«dgtsv_»] (VAR n : LAPACK_Integer; VAR nrhs : LAPACK_Integer; VAR dl : Double; VAR d : Double; VAR du : Double; VAR b : Double; VAR ldb : LAPACK_Integer; VAR info : LAPACK_Integer);
LAPACK.DGTSV (size, nrhs, c0[1], c1[0], c2[0], v[0], size, info);
Обращаю внимание на VAR dl, d, du, b : Double; (VAR — указание на использование передачи по ссылке, а не по значению, аналог в c# — ref) — это не dl, d, du, b : POINTER TO ARRAY OF Double;. И при вызове стоят не указатели на массивы c0, c1, c2, v, а указатели на элементы массивов c0[1], c1[0], c2[0], v[0]. Причём, c0[1] — это указатель на элемент массива с индексом 1 (индексация с 0). К моему удивлению, если в исходнике C# Linalg подправить описание с
static extern void lapack_dgtsv(ref int n, ref int nrhs, double[] dl, double[] d, double[] du, double[] v, ref int ldb, ref int info);
static extern void lapack_dgtsv(ref int n, ref int nrhs, ref double dl, ref double d, ref double du, ref double v, ref int ldb, ref int info);
то и вызов можно сделать не
lapack_dgtsv (ref size, ref nrhs, c0, c1, c2, v, ref size, ref info);
lapack_dgtsv(ref size, ref nrhs, ref c0[1], ref c1[0], ref c2[0], ref v[0], ref size, ref info);
т.е. тот же трюк, что работал в Компонентном Паскале можно провернуть и тут (c0[1]).
Итак, решаем одномерную стационарную задачу теплопроводности d2u/dx2 = 0 на трёх точках — да, это смешно, но это самый простой тест. Вторая производная аппроксимируется так: u[2] — 2*u[1] + u[0] = 0. Левое граничное условие — u[0] = 0, правое — u[1] = 1. Матрица коэффициентов и прочее:
0 [1 0 0] [u0] [0] [1 -2 1] * [u1] = [0] [0 0 1] 0 [u2] [1]
Стационарное решение — прямая x = i/(N-1), где i = 0..2, N = 3, т.е. u = (0, 0.5, 1). Нулевые элементы матрицы за пределами []-скобок — как бы продолжения над- и под-диагоналей.
Основная диагональ — (1, -2, 1). Нижняя диагональ — (1, 0), а с учетом дополнительного элемента (0, 1, 0). Аналогично — верхняя: (0, 1, 0)
Дополнительные элементы как-бы не используются, но есть. Они позволяют избежать смещения индексов: с0[i-1] вместо желаемого с0[i].
с0[i-1] := a[i,i-1]; с1[i] := a[i,i]; с2[i] := a[i,i+1];
using System; using System.Runtime.InteropServices; namespace Linalg < class Program < [DllImport(«openblas.dll», EntryPoint = «dgtsv_»)] static extern void lapack_dgtsv(ref int n, ref int nrhs, ref double dl, ref double d, ref double du, ref double v, ref int ldb, ref int info); static void Main(string[] args) < int size = 3; int nrhs = 1; double[] c0 = new double[] < 0.0, 1.0, 0.0 >; double[] c1 = new double[] < 1.0, -2.0, 1.0 >; double[] c2 = new double[] < 0.0, 1.0, 0.0 >; double[] v = new double[] < 0.0, 0.0, 1.0 >; int info = 0; Console.WriteLine(«v = (, , )», v[0], v[1], v[2]); lapack_dgtsv(ref size, ref nrhs, ref c0[1], ref c1[0], ref c2[0], ref v[0], ref size, ref info); Console.WriteLine(«info = «, info); Console.WriteLine(«v = (, , )», v[0], v[1], v[2]); > > >
Источник: husl.ru