我正在尝试使用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)]
我使用文件添加了强名称,并通过项目属性添加了它,并且还启用了
为了注册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.
我不知道自己错过了什么。我在网上搜索但无法解决此问题。请帮帮我。我上周坚持这个问题。
感谢
乔纳森
答案 0 :(得分:2)
希望将此作为评论发布,但尚未获得足够的声誉。
这是一个很长的镜头,但我在几年前发现了一个类似的错误报告,他们建议运行FileMon.exe来检查引用的文件是否在路径中丢失。 Filemon应该能够帮助您找到对此丢失/失败文件的调用。
UniCode中的错误(냈#)是故意还是部分原因不起作用?
答案 1 :(得分:1)
最后,当我尝试使用新方法时,我注意到Windows Server 2008 R2发生了同样的错误。我以前认为这只发生在Windows 8.1上。经过一些试验和错误,我意识到它与触发器属性有关。复制:
我有触发规则设置,包括属性消息ID(作为变体)和消息正文(作为变体)
签名 COM +方法是:
public string MyComMethod(string queueMessageId, object messageBody)
请注意,消息ID(作为变体)属性是variant
而不是字符串 - 这似乎是潜在的问题,即接口与传递的内容不匹配通过触发器。
从邮件签名和触发器属性中删除string queueMessageId
后,触发器开始针对Windows Server 2008 RS SP1和Windows 8.1运行。如果需要在COM +接口上接收消息ID(作为变体),则正确的参数类型为byte[]
。必须将其转换回string
才能与ReceiveById
和其他方法一起使用 - 请参阅http://goo.gl/91Pp6R和http://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挣扎,但它并没有阻止触发器运行,所以它是可以容忍的。如果我弄明白的话,我会在这里发帖。