使用MSMQ触发器调用COM +组件时出错

时间:2014-05-12 00:34:23

标签: msmq com+

我正在尝试使用MSMQ触发器将MSMQ消息插入队列时调用COM +方法。在尝试调用时,我收到以下错误

The action defined by the rule # with the ID 냈# was not invoked. The COM object may not be registered, or the executable file may not exist in your path. Error 0xc00e0e0a

以下是我的班级图书馆

[Guid("D924540B-BAC7-4764-9250-8494D497A079"), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(DBCOM_Events))]
public class MyComLibClass : myinterface
{
    public void sayLibHello()
    {
        System.IO.File.AppendAllText("d:/sam.txt", "hi from component : " + DateTime.Now + Environment.NewLine);
    }
}

[Guid("EA3F8BB3-3670-4C86-9456-6B913DEF9AFF")]
public interface myinterface
{
    [DispId(1)]
    void sayLibHello();
}

[Guid("AF9D6B2D-566D-4314-9B62-EBD14C10C4E8"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface DBCOM_Events
{
}

汇编信息

[assembly: ComVisible(true)]

我使用文件添加了强名称,并通过项目属性添加了它,并且还启用了

enter image description here

为了注册dll,我使用了以下命令

regasm ClassLibrary1.dll /tlb:ClassLibrary1.tlb

gacutil /i ClassLibrary1.dll

我使用

创建了一个COM +应用程序
comexp.msc

我使用" Com + Install Component向导"安装了TypeLibrary并导入了已注册的组件。

在MSMQ的情况下,\

1 . Created a MSMQ
2 . Gave full control to 'Everyone'
3 . Created a Trigger for that Queue
4 . Created rule with some simple condition like, the label does not contain 'xyz'.
5 . Selected Invoke Com+ component and specified the class name and method name.
6 . Both MessageQueue service and MessageQueueTrigger service is running.

我不知道自己错过了什么。我在网上搜索但无法解决此问题。请帮帮我。我上周坚持这个问题。

感谢
乔纳森

2 个答案:

答案 0 :(得分:2)

希望将此作为评论发布,但尚未获得足够的声誉。

这是一个很长的镜头,但我在几年前发现了一个类似的错误报告,他们建议运行FileMon.exe来检查引用的文件是否在路径中丢失。 Filemon应该能够帮助您找到对此丢失/失败文件的调用。

UniCode中的错误(냈#)是故意还是部分原因不起作用?

答案 1 :(得分:1)

最后,当我尝试使用新方法时,我注意到Windows Server 2008 R2发生了同样的错误。我以前认为这只发生在Windows 8.1上。经过一些试验和错误,我意识到它与触发器属性有关。复制:

  1. 我有触发规则设置,包括属性消息ID(作为变体)消息正文(作为变体)

  2. 签名 COM +方法是:

            public string MyComMethod(string queueMessageId, object messageBody)
    
  3. 请注意,消息ID(作为变体)属性是variant而不是字符串 - 这似乎是潜在的问题,即接口与传递的内容不匹配通过触发器。

    从邮件签名和触发器属性中删除string queueMessageId后,触发器开始针对Windows Server 2008 RS SP1和Windows 8.1运行。如果需要在COM +接口上接收消息ID(作为变体),则正确的参数类型为byte[]。必须将其转换回string才能与ReceiveById和其他方法一起使用 - 请参阅http://goo.gl/91Pp6Rhttp://osdir.com/ml/windows.devel.dotnet.cx/2003-11/msg00035.html

    我对MessageIDs的转换方法有点特殊,但似乎有效:

    private static string ConvertId(byte[] queueMessageId)
    {
        var guidAsByteArray = new byte[16];
        Array.Copy(queueMessageId, guidAsByteArray, 16);
    
        //Start at position 16 to get the unique message ID
        return String.Format(
            @"{0}\{1}", 
            new Guid(guidAsByteArray), 
            BitConverter.ToUInt32(queueMessageId, 16)
        );
    }
    

    关于错误中的神秘字符,我怀疑COM +错误日志记录正在与MSIL DLL挣扎,但它并没有阻止触发器运行,所以它是可以容忍的。如果我弄明白的话,我会在这里发帖。