#c #clr #managed
#c #clr #управляемый
Вопрос:
У меня есть старая встроенная библиотека DLL MFC / c , и мне удалось скомпилировать ее с флагом / CLR. Теперь я добавил управляемый класс C / CLI в dll в namaspace.
Файл заголовка находится ниже, а файл cpp имеет только #include для файла заголовка. Встроенная DLL — это огромный проект dll с большим количеством неуправляемого кода, но в нем есть только один управляемый класс c , как показано ниже.
Когда я добавляю эту библиотеку DLL в качестве ссылки на проект .net winforms, я не вижу это пространство имен / класс в обозревателе объектов,
и я получаю ошибку компиляции из-за того, что не нахожу пространство имен «ShashiTest»
Я использую Visual Studio 2008.
Собственные библиотеки DLL в смешанном режиме не могут быть добавлены в качестве ссылки на управляемый проект?
Или я что-то упускаю
Пожалуйста, помогите.
#pragma once
#using<mscorlib.dll>
#using<system.windows.forms.dll>
// Class derived from Forms
using namespace System::Windows::Forms;
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Diagnostics;
using namespace System::Windows::Forms;
namespace ShashiTest {
/// <summary>
/// Summary for test
/// </summary>
public ref class test
{
public:
test(void)
{
};
void ShowMessage()
{
MessageBox::Show("Hello World");
}
};
}
Когда я упростил свою проблему..Я создал новую библиотеку DLL MFC и добавил к ней управляемый класс C (тот же класс, что и выше). Скомпилирована с флагом / CLR.
Когда я добавляю эту библиотеку DLL в проект winforms и запускаю ее, я получаю
Система.Исключение BadImageFormatException. Есть какие-либо подсказки?
Однако я вижу, что класс и пространство имен, а проект winform отлично компилируется, в отличие от проблемы, с которой я столкнулся выше.
Комментарии:
1. Это должно сработать. Может быть, вам следует показать какой-нибудь код? Или используйте reflector для проверки содержимого вашей библиотеки DLL.
Ответ №1:
System.BadImageFormatException
обычно вызвано наличием в AnyCPU
приложении .NET ссылки на DLL, содержащую 32-разрядный собственный код. При запуске на 64-разрядной платформе появляется ошибка, поскольку AnyCPU
приложение выполняется как 64-разрядное и не может загрузить DLL. Исправление для этого заключается в том, чтобы (легко) пометить приложение как только для x86 или (сложно) предоставить как 32-разрядные, так и 64-разрядные версии всех библиотек DLL, содержащих машинный код.
Конечно, у вас может быть какая-то другая проблема. Проверка вашей библиотеки DLL с помощью Red Gate Reflector, как предложено @cdleonard в комментариях, является отличным следующим шагом. Или ILSpy, который является бесплатным.
Комментарии:
1. Спасибо, это была моя проблема, я перенес свое .net-приложение на x86, и проблема исчезла.