Неуправляемый шаблон C++ в управляемом С++ бросает плохое изображение?

У меня есть Управляемый С++ 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, который, кажется, дает мне, плохо отображают.

1
задан Adam 16 May 2018 в 07:49
поделиться

2 ответа

Я не уверен, но мне кажется, что вы не можете экспортировать общие (шаблонные) классы из dll. Шаблоны создаются при ссылке в коде во время сборки. Это означает, что исходный код шаблона должен быть виден во время сборки, а это не так. У вас есть предварительно скомпилированная dll, как вы ожидаете создания экземпляра шаблона?

2
ответ дан 2 September 2019 в 22:55
поделиться

Получается, что обходной путь заключался в перемещении неуправляемых реализаций шаблонов в их собственные dll неуправляемых реализаций. Интерфейс, который предоставляет параметры шаблона, МОЖЕТ быть представлен через файл h. Но я не мог реализовать шаблон внутри управляемой dll. Итак, в основном

[базовая библиотека предоставляет dll шаблонов] -> [реализация dll шаблонов] -> [управляемая dll C ++]

Все было хорошо, пока h-файлы скрывали реализацию класса шаблона.

0
ответ дан 2 September 2019 в 22:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: