我正忙于编写 C# IBM MQ 客户端应用程序并不断获得 "Exception: The type initializer for 'IBM.WMQ.Nmqi.UnmanagedNmqiMQ' threw an exception."

I am busy writing a C# IBM MQ Client app and keep getting "Exception: The type initializer for 'IBM.WMQ.Nmqi.UnmanagedNmqiMQ' threw an exception."

我已成功获得 MQ 客户端 运行,并且可以使用它获取消息。

我们已经设置了必要的环境变量: MQCHLLIB 和 MQCHLTAB 以及 MQSSLKEYR。

.TAB 文件位于正确的文件夹中。 但是,当我执行以下代码时:

private static bool ConnectMq()
    {
        try
        {
            queueManager = new MQQueueManager("ECG_MBTST_QM", Init(false));
            queueManager.Connect();
            if (queueManager.IsConnected)
            {
                Console.WriteLine("Connected...");
            }
            return true;
        }
        catch (MQException exp)
        {
            Console.WriteLine("Exception Message: " + exp.Message); 
        }
        catch (Exception exp)
        {
            Console.WriteLine("Exception: " + exp.Message);
        }
        return false;
    }
    private static Hashtable Init()
    {
        Hashtable properties;
        properties = new Hashtable
            {
                {MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_CLIENT}
            };

        return properties;
    }

我收到了所描述的错误消息。 我别无选择,只能使用服务器主机指定的 CCDT 文件。 我相信服务器是 v7,我正在引用 v8 WMQ 库。 理论上这应该可行。

我也尝试过使用标准属性集(出于安全目的更改了值):

properties = new Hashtable
            {
                {MQC.TRANSPORT_PROPERTY, "TCP"},
                {MQC.CHANNEL_PROPERTY, "Channel"},
                {MQC.CONNECTION_NAME_PROPERTY, "IBM_MQ_Conn"},
                {MQC.PORT_PROPERTY, "1414"},
                {MQC.HOST_NAME_PROPERTY, "IP Address"},
                {MQC.SSL_CIPHER_SPEC_PROPERTY, "TLS_RSA_WITH_AES_128_CBC_SHA"}
            };

但是当我使用上述属性时,出现 2538 错误 - 主机不可用。 关于如何同时使用 CCDT 文件和 C#,我是否遗漏了什么?

提前致谢。

编辑 - 根据 JoshMC 的要求

这是来自 AMQERR01.LOG 文件的最新条目:

1/18/2017 1:51:05 AM - Process(3272.1) User(andrewhuntley) Program( MQ app.exe)
AMQ9202: Remote host '192.168.150.102' not available, retry later.

EXPLANATION:
The attempt to allocate a conversation using TCP/IP to host '192.168.150.102'
for channel  (Exception) was not successful. However the error may be a
transitory one and it may be possible to successfully allocate a TCP/IP
conversation later. 

 In some cases the remote host cannot be determined and so is shown as '????'.
ACTION:
Try the connection again later. If the failure persists, record the error
values and contact your systems administrator. The return code from TCP/IP is 0
(X'0'). The reason for the failure may be that this host cannot reach the
destination host. It may also be possible that the listening program at host
'192.168.150.102' was not running.  If this is the case, perform the relevant
operations to start the TCP/IP listening program, and try again.
----- MQTCPConnection.cs : 357 ------------------------------------------------

请注意服务器已启动 运行 并且可以访问,因为我可以使用已安装的 IBM 客户端连接到它。

NuGet Managed IBM WebSphere MQ Client for .NET 使用 IBM MQ 8.0.0.5 MQ 库。

我从 IBM 找到了这个 APAR IT14222,它似乎与您收到的错误消息完全匹配。

这应该会在下一个修复包 8.0.0.6 中修复,该修复包应该会在 2017 年 3 月底之前发布。如果您有 IBM 支持合同,您也可以打开 PMR 并请求他们为您提供一份副本包含针对 8.0.0.5 的此 APAR 修复程序的受影响 dll 的数量。

看到这个问题晚了。

NuGet 上可用的 MQ .NET 客户端不是来自 IBM。它清楚地提到了 "Unofficial"。

它只能用于 .NET 托管模式,不能用于绑定或 .NET 非托管客户端模式,因为它没有其他依赖库。

IBM.WMQ.Nmqi.UnmanagedNmqiMQ 异常是因为 MQ C 客户端库不存在。您可以使用 MQC.TRANSPORT_PROPERTYMQC.TRANSPORT_MQSERIES_MANAGED 值来解决异常,或者 "install" MQ Redistributable Client 如果您想使用 MQC.TRANSPORT_MQSERIES_CLIENT 选项