2

我现在需要一些帮助。如果有人可以帮助我们“转移”我的基于 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) 的外部“C”:

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

然后在 .net 中使用 _dllImport,这适用于上面的函数,但是当向它添加例如 QString 时,它不再识别我的 dll 并抛出 dllNotFoundException。

然后我想也许你需要某种包装,是的,那你怎么做..?用谷歌搜索,但没有什么能真正帮助我使用 c++ 和 qt 函数。

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

4

3 回答 3

2

我认为 C++/CLI 是要走的路。看:使用 C++/CLI 包装非托管 C++ - 一种正确的方法

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

在论坛帖子中深入探讨该主题并不容易。但是通过一些研究,您应该能够很快地创建一些可用的东西。如果您来自 C/C++,C++/CLI 需要一些时间来适应。它的限制性更强,尤其是在混合托管和非托管类型方面。但是文献会引导你到达那里。

编辑:作为对 OP 对我的回答的评论的回应(另见 Ramhound 的评论,我),这是我在这里得到的一个例子:看看链接后面的内容以查看 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。

于 2012-07-31T16:43:05.153 回答
1

您可以在托管 C++ 上创建包装器。然后,您将能够在 c# 中使用托管类。检查这个,它可能会帮助你http://msdn.microsoft.com/en-us/library/ms235638.aspx

于 2012-07-31T16:34:30.733 回答
1

看看http://doc.qt.nokia.com/4.7-snapshot/activeqt-dotnet.html。它有一些关于使用 ActiveQT 的信息,根据网站:

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

该页面还包含有关如何与 .Net 集成的示例。

于 2012-07-31T17:44:04.067 回答