在 C# 中导入 MQIC.DLL

Import MQIC.DLL in C#

在我的系统中,我需要加载 MQIC.DLL (IBM WebSphere MQ) 以向 MQ 服务器发送和获取消息。

目前此服务是运行 VB5,我需要升级到.Net。当我尝试加载这个库时,出现错误:

试图读取或写入受保护的内存。这通常表示其他内存已损坏。

代码:

[DllImport("MQIC.DLL", EntryPoint = "MQCONNstd@16", SetLastError = true)]
public static extern void MQCONN(string QMgrName, long Hconn, long CompCode, long Reason);

有人知道为什么会这样吗?

VB5代码:

Declare Sub MQCONN Lib "MQIC.DLL" Alias "MQCONNstd@16" (ByVal QMgrName As String, Hconn As Long, CompCode As Long, Reason As Long)

这是 MQOD 结构:

public struct MQOD
{
    public String StrucId; //Structure identifier'
    public long Version; //Structure version number'
    public long ObjectType; //Object type'
    public string ObjectName; //Object name'
    public string ObjectQMgrName; //Object queue manager name'
    public string DynamicQName; //Dynamic queue name'
    public string AlternateUserId; //Alternate user identifier'
}

IBM MQ 提供了 .NET 接口。我建议您使用它而不是 MQIC DLL。 http://www.ibm.com/support/knowledgecenter/SSFKSJ_9.0.0/com.ibm.mq.dev.doc/q029250_.htm。产品附带很多样品。

更改 MQCONN 的声明以对所有 long 参数使用 out long

检查每个 API 调用的 MQ application programming reference,并确保对描述为输出或 input/output 的每个参数使用 outref

你也可以在你的MQ安装目录下寻找cmqc.h,前提是你已经安装了开发环境。它具有所有 MQI 调用的声明。您可以将 C header 转录为 C# - 只要您看到指针 (*),请使用 outref.

但一般来说,正如其他人所建议的那样,将托管 .Net 类 用于 MQ 会更好。