У меня есть Управляемый С++ dll, который динамично связывается с неуправляемым C++ dll. Управляемый С++ получает несколько неуправляемых классов из абстрактных интерфейсов в неуправляемом dll.
Это хорошо работает. ICustomer.h в неуправляемом dll
// uses macro __declspec(dllexport)
class EXPORT_API ICustomer
{
public:
virtual void PlaceOrder() = 0;
//...
};
LocalCustomer.h в управляемом С++
#include "unmanagedlib/ICustomer.h"
//an unmanaged derived class defined in the managed dll
class LocalCustomer : public ICustomer
{
public:
void PlaceOrder();
//...
};
LocalCustomer используется в Управляемом dll. Я могу передать его функциям в неуправляемом dll, и все это хорошо работает.
Вот проблема. Я получаю STATUS_INVALID_IMAGE_FORMAT при запуске, когда я пытаюсь реализовать интерфейс, который выставляет шаблон.
Не работает. в неуправляемом Dll
stuct Order
{
double price;
//...
};
template<typename T>
class EXPORT_API ICollection<T>
{
//...
};
class EXPORT_API IFactory
{
public:
virtual ICollection<Order>& GetOrders() = 0;
}
в управляемом С++ dll
class OrderCollection : public ICollection<Order>
{
//...
};
class LocalFactory : public IFactory
{
public:
virtual ICollection<Order>& GetOrders() { return m_orders; }
private:
OrderCollection m_orders;
};
Я сузил его вниз шаблонное переопределение GetOrders. Наличие кода в управляемых причинах dll, которые диалоговое окно для открытия "Приложения не могло запустить правильно (0xc000007b), который является просто STATUS_INVALID_IMAGE_FORMAT HRESULT, бросаемым управляемым загрузчиком. Удаление кода позволяет этому работать. Так что случилось с шаблоном? Почему я не могу использовать его в управляемом dll.
Еще одна подсказка, не уверенная, если это - отвлечение нет.. Я компилирую приложение на 32 бита и работаю на Win7 x64. Как я сказал с, работает просто великолепно, пока шаблон не пересекает dll от неуправляемого до управляемого.
То, что уничтожает меня, является мной, у меня есть несколько неуправляемых шаблонов C++, которые живут полностью в управляемом dll, и они хорошо работают. Это - просто шаблоны, пересекающиеся между dll, который, кажется, дает мне, плохо отображают.
Я не уверен, но мне кажется, что вы не можете экспортировать общие (шаблонные) классы из dll. Шаблоны создаются при ссылке в коде во время сборки. Это означает, что исходный код шаблона должен быть виден во время сборки, а это не так. У вас есть предварительно скомпилированная dll, как вы ожидаете создания экземпляра шаблона?
Получается, что обходной путь заключался в перемещении неуправляемых реализаций шаблонов в их собственные dll неуправляемых реализаций. Интерфейс, который предоставляет параметры шаблона, МОЖЕТ быть представлен через файл h. Но я не мог реализовать шаблон внутри управляемой dll. Итак, в основном
[базовая библиотека предоставляет dll шаблонов] -> [реализация dll шаблонов] -> [управляемая dll C ++]
Все было хорошо, пока h-файлы скрывали реализацию класса шаблона.