我有一个托管 C++ dll,它与非托管 C++ dll 动态链接。托管 C++ 从非托管 dll 中的抽象接口派生几个非托管类。
这工作正常。非托管 dll 中的 ICustomer.h
// uses macro __declspec(dllexport)
class EXPORT_API ICustomer
{
public:
virtual void PlaceOrder() = 0;
//...
};
托管 C++ 中的 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;
}
在托管 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 从非托管到托管就可以了。
杀死我的是 II 有几个非托管 C++ 模板,它们完全存在于托管 dll 中,并且工作正常。只是 dll 之间的模板交叉似乎给我带来了不好的形象。