C# 包装要在C中使用的Qt库#
我有一个用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();从外部看,一切都没有改变。真奇怪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
这是我将本机信号连接到代理类插槽的方式:
...
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);
}