2010-07-20 31 views
1

我有一个托管的C++ DLL,它与一个非托管的C++ DLL动态链接。托管的C++从非托管dll中的抽象接口派生出几个非托管类。托管C++中的非托管C++模板会抛出错误的图像?

这工作正常。
----------
//使用宏__declspec(DLLEXPORT)
类EXPORT_API ICustomer
{
公共:
虚拟无效PlaceOrder()= 0;
//
};
----- <在托管C++> -----
`的#include “unmanagedlib/ICustomer.h”

//在托管的DLL中定义的非托管派生类
类LocalCustomer.h LocalCustomer:public ICustomer
{
public:
void PlaceOrder();
//
};

LocalCustomer用于Managed dll。我可以将它传递给非托管dll中的函数,并且它可以正常工作。

这是问题所在。 当我尝试实现一个暴露模板的接口时,我在启动时得到一个STATUS_INVALID_IMAGE_FORMAT。

不运行。
--------
stuct订单
{
双价;
// ...
};

模板<typename T>
类EXPORT_API ICollection的
{
// ....
};

类EXPORT_API器IFactory
{
公共:
虚拟ICollection的<Order> & GetOrders()= 0;
}
------ <在托管C++ DLL> -------

类OrderCollection:公共的ICollection <Order>
{
//
};

类LocalFactory:公共器IFactory
{
公共:
虚拟ICollection的<Order> & GetOrders(){返回m_orders; }
private:
OrderCollection m_orders;
};

我已经缩小了模板覆盖GetOrders。在托管dll中的代码会导致一个对话框打开“应用程序无法正确启动(0xc000007b),这只是托管加载器引发的STATUS_INVALID_IMAGE_FORMAT HRESULT。删除代码允许它运行。那么模板有什么问题为什么我不能在托管的DLL中使用它

另一个线索,不知道这是否是一个分心..我正在编译一个32位应用程序,并运行在Win7 x64上。只要模板没有跨越dll从非托管到管理。

什么杀我是我有几个非托管的C++模板,完全生活在托管的DLL中,他们工作得很好,它只是模板之间的交叉似乎给我不好的形象的dll。

回答

2

我不确定,但在我看来,您无法从dll导出通用(模板)类。模板在构建时在代码中引用时被实例化。这意味着模板的源代码必须在构建时可见,但情况并非如此。你有一个预编译的DLL,你会如何期待模板实例化?

+0

这是正确的。 .NET泛型可以在运行时暴露,但C++模板是构建时间,不能在运行时暴露。 – Puppy 2010-07-20 16:07:10

0

事实证明,解决方法是将非托管模板实现移动到他们自己的非托管实现dll中。暴露模板参数的界面可以通过h文件暴露。但我似乎无法在受管dll内部实现该模板。 所以基本上

[基础库公开模板DLL] - > [模板实现DLL] - > [托管C++的dll]

这一切都是好的,只要.h文件藏模板类的实现。