繁体   English   中英

Qt非托管C ++类可与C#.Net一起使用

[英]Qt unmanaged C++ class to work with C# .Net

我现在需要一些帮助。 如果有人可以帮助我们“转移”基于QT的代码以与我的C#应用​​程序一起工作,我将非常乐意。

可以说我有这个简单的QT类:

class ItShouldWork : public QObject
{
    Q_OBJECT

public:
    ItShouldWork(QObject* parent = 0) : QObject(parent){}
    QString id() const { return objectName(); }

};

现在,我希望能够使用Visual Studio C#访问此类,我尝试创建非托管dll并通过包装程序进行访问,尝试创建COM组件,但是现在我完全被卡住了,因此我将回到从这个简单的类开始。 我已经看到您可以将__declspec(dllexport)与extern“ C”一起使用,如下所示:

extern "C" __declspec(dllexport) double Subtract(double a, double b)

然后在.net中使用_dllImport,则可以与上面的函数正常工作,但是在向其中添加例如QString时,它不再识别我的dll,并抛出dllNotFoundException。

然后我想也许您需要某种包装纸,是的,那您该怎么做呢? 谷歌走了,但并没有真正帮助我的C ++和QT函数。

一步一步地介绍如何直接创建dll和c-wrapper或直接创建COM组件dll真是太棒了,我不太在乎它是如何完成的,但是如果您知道一种方法,请帮我做一个小教程? 我要疯了...

我认为C ++ / CLI是必经之路。 请参阅: 用C ++ / CLI包装非托管C ++-正确的方法

特别是: http : //www.delmarlearning.com/companions/content/1592009638/bonus/009638_BonusCh02.pdf

在论坛帖子中深入了解该主题并不容易。 但是通过一些研究,您应该能够很快地创建可用的东西。 如果您来自C / C ++,那么C ++ / CLI会习惯一些。 限制要多一些,尤其是在混合托管和非托管类型方面。 但是文献可以指导您。

编辑:为了回应OP对我的回答的评论(另请参见Ramhound,Me的评论),这是我在这里得到的一个示例:请查看链接后面的内容以查看m_impl的上下文...

String ^ CSimpleObjectWrapper::ToString(void) 
{ 
    wchar_t szStr[100]; 
    HRESULT hr = m_impl->ToString(szStr, ARRAYSIZE(szStr)); 
    if (FAILED(hr)) 
    { 
        Marshal::ThrowExceptionForHR(hr); 
    } 
    // Marshal PWSTR to System::String and return it. 
    return gcnew String(szStr); 
} 

编辑2:还取决于所需的包装的深度/复杂性/功能,您可能会考虑在C ++ / CLI“ ref class” es中包装类,而不是使用DllImport。

您可以在托管C ++上创建包装器。 然后,您将可以在c#中使用托管类。 选中此选项,可能会对您有所帮助http://msdn.microsoft.com/zh-cn/library/ms235638.aspx

看看http://doc.qt.nokia.com/4.7-snapshot/activeqt-dotnet.html 它包含有关使用ActiveQT的一些信息,每个网站上都有:

Qt对ActiveX和COM的支持使Windows开发人员可以使用Qt:访问和使用其Qt应用程序中任何ActiveX服务器提供的ActiveX控件和COM对象。 使它们的Qt应用程序可用作COM服务器,并使用任意数量的Qt对象和小部件作为COM对象和ActiveX控件。

该页面还提供了有关如何与.Net集成的示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM