Сериализация типа в сборке x64 в XML - PullRequest
0 голосов
/ 27 сентября 2010

У меня есть .dll, которая скомпилирована для 64-битных, содержит класс, который я могу сериализовать в XML.Библиотека скомпилирована в Visual Studio с использованием флага «AnyCPU».

У меня есть другой процесс, который ссылается на этот .dll, создает объект этого типа, а затем пытается сериализовать его в XML следующим образом:

XmlSerializer serializer = new XmlSerializer(typeof(COLLADA));
using (TextWriter w = new StreamWriter(m_colladaPath, false, System.Text.Encoding.UTF8))
{
serializer.Serialize(w, collada.COLLADA); //exception occurs here
}

Этот процесс работает правильно на 32-битной машине.При попытке на 64-битной машине код компилируется без ошибок, но во время выполнения я получаю сообщение об ошибке «Target Invocation» следующим образом:

System.Reflection.TargetInvocationException произошла Message = "Исключение было вызваноцель вызова ".Source = "mscorlib"
StackTrace: at System.RuntimeMethodHandle._InvokeMethodFast (Объектная цель, аргументы Object [], SignatureStruct & sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) в System.RuntimeMethoFidOfficeMjectOkeHDsig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) InnerException: System.BadImageFormatException Message = "Не удалось загрузить файл или сборку" goBIM_API, Version = 1.0.3922.23514, Culture = нейтральный, PublicKeyToken = null 'или одна из его зависимостей. Попытка.было сделано для загрузки программы с неверным форматом. " Source =" xnzfsdbo "FileName =" goBIM_API, Version = 1.0.3922.23514, Culture = нейтральный, PublicKeyToken = null "FusionLog = StackTrace: at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterCOLLADA.Write653_COLLADA (Object o) InnerException:

Я трижды проверил, что теперь все скомпилировано для AnyCPU, а также попытался скомпилировать Everything, включая библиотеку, до "x64", безуспешно.Я не использую какие-либо конкретные битовые указатели, например, "IntPtr" в библиотеке.

ОБНОВЛЕНИЕ: Я создал автономное приложение, используя эту библиотеку, создал тестовый объект и сериализовал его без ошибок (все в x64).Кажется, проблема связана с тем фактом, что сериализация происходит в методе, вызываемом другим приложением.То есть метод является частью интерфейса подключаемого модуля для другого приложения.Что-то в API приложения мешает с сериализацией.Приложение Autodesk's Revit.Не уверен, что кто-нибудь здесь является гуру Revit?

Ответы [ 4 ]

1 голос
/ 27 сентября 2010

Похоже, что goBIM_API или одна из его ссылок 32-битная.Если у вас есть какая-либо сборка, помеченная как x86, она не будет загружаться в сборку x64.

0 голосов
/ 28 сентября 2010

Поскольку сериализатор вызывался в методе, вызываемом другим процессом, файл goBIM_API.dll должен располагаться в том же каталоге, что и исполняемый файл этого процесса.После перемещения .dll в это место сериализация работает нормально.

0 голосов
/ 27 сентября 2010

Скомпилировали ли вы DLL, используя многопоточность (/ MT), чтобы все зависимости были помещены в двоичный файл вашей DLL?

0 голосов
/ 27 сентября 2010

Похоже, что вы используете стороннюю библиотеку (goBIM_API.dll), которая присутствует только в виде 32-разрядной версии.Вы получаете исключение, потому что 32-битная сборка не может быть загружена в 64-битный процесс.

Чтобы устранить эту проблему, либо получите 64-битную версию этой библиотеки, либо, что проще, установите цельПлатформа для x86 для всех ваших исполняемых файлов.

Использование x86 на 64-битной платформе обычно не должно иметь заметного снижения производительности.Единственным недостатком является то, что вы не можете превысить лимит памяти 2 ГБ / 3 ГБ процесса.

Обновление:

Является ли AutoDesk Revit 32-разрядным приложением?Вот как это выглядит.Затем вам нужно будет скомпилировать вашу библиотеку, используя целевую платформу x86, чтобы исправить ошибку.

...