Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 包装要在C中使用的Qt库#_C#_C++_Qt_Wrapper_Signals Slots - Fatal编程技术网

C# 包装要在C中使用的Qt库#

C# 包装要在C中使用的Qt库#,c#,c++,qt,wrapper,signals-slots,C#,C++,Qt,Wrapper,Signals Slots,我有一个用Qt编写的网络引擎库,我想在C#应用程序中使用它,所以我用C++/CLI将其包装并静态链接在一起。将包装器dll添加到我的C#应用程序后,在dll加载阶段的运行时出现“BadImageFormatException”错误。我尝试将所有exe和DLL复制到Qt DLL旁边,但没有任何更改 此外,我无法直接从CLI包装器项目(DLL)引用c#应用程序,我在VS2010中添加了“浏览”选项卡,而不是“项目”选项卡。是否可以,或者是否有其他方法添加引用? 谢谢 编辑: 当我将C#app->Pr

我有一个用Qt编写的网络引擎库,我想在C#应用程序中使用它,所以我用C++/CLI将其包装并静态链接在一起。将包装器dll添加到我的C#应用程序后,在dll加载阶段的运行时出现“BadImageFormatException”错误。我尝试将所有exe和DLL复制到Qt DLL旁边,但没有任何更改

此外,我无法直接从CLI包装器项目(DLL)引用c#应用程序,我在VS2010中添加了“浏览”选项卡,而不是“项目”选项卡。是否可以,或者是否有其他方法添加引用? 谢谢

编辑:

当我将C#app->Properties->Build->Platform目标更改为x86时,问题得到了解决

我还使用向导创建了一个新的“类库”(CLR)项目,并重新定义了所有qt自定义构建步骤,现在我可以直接添加项目引用

编辑2:

现在出现了一个严重的问题,带有自定义元类型(在本机库中称为Q_DECLARE_元类型(CustomTypeClass))的信号无法连接或无法处理

编辑3:

看起来问题与自定义元类型无关。QTcpSocket从未像“已连接”或其他信号一样发出“readyRead”信号。我尝试调用QCoreApplication::processEvents();从外部看,一切都没有改变。真奇怪


这是我将本机信号连接到代理类插槽的方式:

...
    rawPtr = new NetworkClient(Marshaller::StringToQString(_serverIp), _serverPort); // Native
    mEventProxy = new NetworkClientEventProxy(this); // Native but mixed with gcroot<>
    QObject::connect(rawPtr, SIGNAL(signal_connected()), mEventProxy, SLOT(slot_connected()));
    QObject::connect(rawPtr, SIGNAL(signal_disconnected()), mEventProxy, SLOT(slot_disconnected()));
    QObject::connect(rawPtr, SIGNAL(signal_packetReceived(NetworkPacket)), mEventProxy, SLOT(slot_packetReceived(NetworkPacket)));
    QObject::connect(rawPtr, SIGNAL(signal_error(QAbstractSocket::SocketError)), mEventProxy, SLOT(slot_error(QAbstractSocket::SocketError)));
...

您在64位应用程序中使用32位DLL,反之亦然。我已经尝试过不同的配置,我认为QT-DLL存在一些问题。如果您认为它对其他类似问题的人有价值,请考虑将该解决方案写入解决方案。已编辑问题上描述的新问题。
#ifndef NETWORKCLIENTEVENTPROXY_H
#define NETWORKCLIENTEVENTPROXY_H

#include <QObject>
#include <vcclr.h>
#include "NetworkingCLIGlobals.h"

namespace Networking
{
    class NetworkClientEventProxy : public QObject
    {
        Q_OBJECT

    public:
        NetworkClientEventProxy(NetworkClientCLI^ _clientCLI);
        ~NetworkClientEventProxy();

    public slots:
        void slot_connected();
        void slot_disconnected();
        void slot_packetReceived(NetworkPacket _packet);
        void slot_error(QAbstractSocket::SocketError _socketError);

    private:
        gcroot<NetworkClientCLI^> mCLIRoot;
    };
}
#endif // NETWORKCLIENTEVENTPROXY_H
#include "NetworkClientEventProxy.h"
#include "NetworkPacketCLI.h"
#include "NetworkClientCLI.h"

using namespace Networking;

NetworkClientEventProxy::NetworkClientEventProxy(NetworkClientCLI^ _clientCLI)
    : mCLIRoot(_clientCLI)
{
}

NetworkClientEventProxy::~NetworkClientEventProxy()
{
}

void NetworkClientEventProxy::slot_connected()
{
    // slot works
    mCLIRoot->onConnectedEventTrigger();
}

void NetworkClientEventProxy::slot_disconnected()
{
    // slot works
    mCLIRoot->onDisconnectedEventTrigger();
}

void NetworkClientEventProxy::slot_packetReceived(NetworkPacket _packet)
{
    // SLOT DOES NOT WORK !
    NetworkPacketCLI^ packet = gcnew NetworkPacketCLI();
    packet->rawPtr = &_packet;
    mCLIRoot->onPacketReceivedEventTrigger(packet);
}

void NetworkClientEventProxy::slot_error(QAbstractSocket::SocketError _socketError)
{
    // slot works
    mCLIRoot->onErrorEventTrigger((SocketErrorCLI)_socketError);
}