我有一个.Net COM服务器,它有一个接收消息和延迟作为参数的方法。延迟之后,它会触发将消息发送回客户端的事件。
适用于.Net和VB6客户端。
为了使COM事件在FoxPro中绑定,您必须创建一个在foxpro中实现事件接口的类并将其连接起来,如下所述: http://www.west-wind.com/presentations/dotnetfromVfp/DotNetFromVfp_EventHandling.asp
我有这样一个班级:
DEFINE CLASS ComEventHandler AS session OLEPUBLIC
IMPLEMENTS IComServerEvents IN "PcaTest.ComServer"
* "C:\ComTest\PCATest.tlb"
PROCEDURE IComServerEvents_TimerExpired(message AS STRING) AS VOID
* add user code here
?message
ENDPROC
ENDDEFINE
用来连接它的代码:
loMM = CREATEOBJECT("PcaTest.ComServer")
loEvents = CREATEOBJECT("ComEventHandler")
EventHandler(lomm, loevents)
当我运行此代码时,我找不到类型库PcaTest.ComServer。但是,如果我将implements线更改为:
,它将按预期工作IMPLEMENTS IComServerEvents IN "C:\ComTest\PCATest.tlb"
我无法硬编码tlb的位置。
行“CREATEOBJECT(”PcaTest.ComServer“)”实际上工作正常,如果我不尝试实例化ComEventHandler对象,那么该COM对象将被实例化,我可以调用其方法并访问其属性。事件处理程序类(大部分)仅在我提供.tlb而不是progId时才起作用。
.Net COM服务器已在GAC中注册。我已尝试使用和不使用/ codebase以及使用和不使用/ tlb或/tlb:filename.tlb
我确实在某一点上进行了测试,或者看起来如此。我现在无法复制这些结果,但是当我使用它时,我使用了/ codebase和/tlb:filename.tlb。
答案 0 :(得分:0)
你提到你不能对该位置进行硬编码,我想知道你是否可以把它放到一个表中,从表中选择它然后使用这样的东西
tlbLocation(包含路径的字段)
实施IComServerEvents IN(tlbLocation)
我对某些应用程序执行类似的路径规范
答案 1 :(得分:0)
我不想回答我自己的问题。再次。但我明白了。
答案:当程序集在GAC中注册时使用regasm / codebase使其无法正常工作。我的问题是,如果我在GAC中安装程序集之前就行了,那么它会起作用,但如果程序集首先在GAC中注册,或者它是在GAC中注册并且稍后调用regasm,FoxPro会得到困惑。
在FoxPro中使用.Net COM服务器的事件绝对需要:
/ codebase标志将这样的内容添加到注册表中:
[HKEY_CLASSES_ROOT\CLSID\{A2DA47BD-15E8-48E3-BA54-4B1CED2D3C01}\InprocServer32]
@="mscoree.dll"
"CodeBase"="file:///C:/MACsWave/PCATest/pcatest.dll"
代码库是必需的,即使汇编应该可以从GAC访问。 / VB6客户端不需要/ codebase,例如
因为使用了/ codebase标志,所以不需要在GAC中注册程序集。
如果您确实将程序集添加到GAC并随后调用regasm / codebase,则可以在注册表中获取:
[HKEY_CLASSES_ROOT\CLSID\{A2DA47BD-15E8-48E3-BA54-4B1CED2D3C01}\InprocServer32]
@="mscoree.dll"
"CodeBase"="file:///C:/WINDOWS/assembly/GAC_32/PCATest/1.1.0.0__325ac2fec08eafa8/PCATest.dll"
我想知道FoxPro是否正在寻找与dll在同一目录中的tlb文件,但发现GAC中没有.tlb。或者某事......
无论如何,问题已经解决了。