从C#线程调用非托管代码 我有一个非托管C++库,我已经创建了一个托管C++包。我现在正试着从C#给这个打电话。到现在为止,一直都还不错。但是,当我试图在C#线程中从内部调用相同的代码时,我会从非托管代码中得到异常:
表达式:向量下标超出范围 这可能吗?我假设每个线程都会得到它自己的非托管类实例 我已经搜索了很长很长的时间来获取更多关于从线程内调用非托管代码的信息,但至少信息似乎很少 提前谢谢你的帮助 C++包装器从C#线程调用非托管代码 我有一个非托管C++库,我已经创建了一个托管C++包。我现在正试着从C#给这个打电话。到现在为止,一直都还不错。但是,当我试图在C#线程中从内部调用相同的代码时,我会从非托管代码中得到异常:,c#,c++,multithreading,dll,managed,C#,C++,Multithreading,Dll,Managed,表达式:向量下标超出范围 这可能吗?我假设每个线程都会得到它自己的非托管类实例 我已经搜索了很长很长的时间来获取更多关于从线程内调用非托管代码的信息,但至少信息似乎很少 提前谢谢你的帮助 C++包装器 // Managed wrapper public ref class EllipseFit { private: // Pointer to unmanaged class UnmanagedEllipseFit* _unmanagedEllipseFit; p
// Managed wrapper
public ref class EllipseFit
{
private:
// Pointer to unmanaged class
UnmanagedEllipseFit* _unmanagedEllipseFit;
public:
// Constructor & Destructor
EllipseFit()
{
_unmanagedEllipseFit = new UnmanagedEllipseFit();
}
~EllipseFit()
{
delete _unmanagedEllipseFit;
}
List<Ellipse^>^ ProcessImage(array<Byte>^ image, int width, int height)
{
pin_ptr<unsigned char> pimg = &image[0];
_unmanagedEllipseFit->processsImage(pimg, width, height);
// Marshal the results... <edited>
return ellipses;
}
};
NET中的托管类型遵循相同的规则,无论它们是用C#还是C++/CLI编写的 虽然可以为每个线程创建一个新的C++/CLI类实例,但如果您不告诉编译器这正是您想要的,它是不会自动发生的 编辑:查看代码,除了内存泄漏之外,我没有发现任何问题。C++/CLI类应同时具有析构函数和终结器,如下所示:
!EllipseFit()
{
delete _unmanagedEllipseFit;
_unmanagedElipseFit = nullptr;
}
~EllipseFit() { this->!EllipseFit(); }
至于崩溃——可能非托管代码使用静态或全局变量,因此不能从多个线程同时使用。您必须展示一些C++/CLI代码,以便我们理解这一点。*编辑*只有当我有多个线程时才会发生异常。在它的线索;如果没有其他线程,我看不到任何异常。您是否为每个线程显式创建单独的类实例?如果托管包装器类或非托管本机类不是为多线程设计的,那么共享它们是一个很大的问题。嗨,Mike,是的,我为每个线程创建了一个新的EllipseFit实例。抱歉没有提前发布代码。嗨,Ben,我确实在每个线程中创建了托管包装的实例。我只是不明白为什么如果每个线程都有自己的实例,那么当我运行多个线程时,我会看到不同的行为..啊,现在。。在非托管的C++代码中,一个全局变量似乎是问题所在。谢谢你的帮助@用户:您可能还需要一个
using
语句来确保及时处理对象。
Thread t1 = new Thread(DcThread);
t1.Start();
!EllipseFit()
{
delete _unmanagedEllipseFit;
_unmanagedElipseFit = nullptr;
}
~EllipseFit() { this->!EllipseFit(); }