我有一个.Net COM服务器,它有一个将消息和延迟作为参数的方法。延迟后,它会触发一个事件,将消息发送回客户端。
它适用于 .Net 和 VB6 客户端。
为了在 FoxPro 中绑定 COM 事件,您必须创建一个在 foxpro 中实现事件接口的类并将其连接起来,如下所述:http://www.west-wind.com/presentations/dotnetfromVfp/DotNetFromVfp_EventHandling.asp
我有这样一个类:
DEFINE CLASS ComEventHandler AS session OLEPUBLIC
IMPLEMENTS IComServerEvents IN "PcaTest.ComServer"
* "C:ComTestPCATest.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 IComServerEvents IN "C:ComTestPCATest.tlb"
我无法对 tlb 的位置进行硬编码。
实际上,"CREATEOBJECT("PcaTest.ComServer"("行工作正常,如果我不尝试实例化ComEventHandler对象,则该COM对象将被实例化,我可以调用其方法并访问其属性。事件处理程序类(大多数(仅在我向它提供 .tlb 而不是 progId 时才起作用。
.Net COM 服务器已在 GAC 中注册。我尝试过有和没有/codebase 以及有和没有/tlb 或/tlb:filename.tlb 的 regasm
我确实在某个时候在测试中工作过,或者看起来是这样。我现在无法复制这些结果,但是当我让它工作时,我使用了/codebase 和/tlb:filename.tlb。
你提到你不能对位置进行硬编码,我想知道你是否可以把它放到一个表中,从表中选择它,然后使用这样的东西
tlb位置(包含路径的字段(
实现 IComServerEvents IN (tlbLocation(
我对我的一些应用程序执行类似的路径规范
我讨厌回答我自己的问题。再。但我明白了。
答:在 GAC 中注册程序集时使用 regasm/codebase 会使它不起作用。我的问题是,如果我在 GAC 中安装程序集之前执行了 regasm,它会起作用,但如果程序集首先在 GAC 中注册,或者如果在 GAC 中注册并且稍后调用 regasm,FoxPro 会感到困惑。
在 FoxPro 中使用 .Net COM 服务器的事件绝对需要:
- 程序集注册为 COM (progId 和 ClsId(,可能由 regasm 注册
-
regasm 上的/codebase 标志,将类似这样的东西添加到注册表中:
[HKEY_CLASSES_ROOTCLSID{A2DA47BD-15E8-48E3-BA54-4B1CED2D3C01}InprocServer32] @="mscoree.dll" "CodeBase"="file:///C:/MACsWave/PCATest/pcatest.dll"
代码库是必需的,即使程序集应该可以从 GAC 访问。 例如,VB6 客户端不需要/codebase
- /tlb 标志用于注册类型库。/tlb:"文件名"不是必需的。
由于使用了/codebase 标志,因此不需要在 GAC 中注册程序集。
如果您确实将程序集添加到 GAC 并随后调用 regasm/codebase,则会在注册表中得到以下内容:
[HKEY_CLASSES_ROOTCLSID{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。什么的...
无论如何,问题解决了。