Неуправляемый шаблон C ++ в управляемом C ++ создает плохое изображение? - PullRequest
1 голос
/ 20 июля 2010

У меня есть управляемая DLL C ++, которая динамически связывается с неуправляемой DLL C ++.Управляемый C ++ выводит несколько неуправляемых классов из абстрактных интерфейсов в неуправляемой dll.

Это прекрасно работает.ICustomer.h в неуправляемой dll

//  uses macro __declspec(dllexport)
class EXPORT_API ICustomer
{
public:
    virtual void PlaceOrder() = 0;
    //...
};  

LocalCustomer.h в управляемом C ++

#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;
}

в управляемом C ++ 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, которые, кажется, дают мне плохое изображение.

Ответы [ 2 ]

2 голосов
/ 20 июля 2010

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

0 голосов
/ 21 июля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...