为什么从 FoxPro 客户端使用 .Net COM 服务器时找不到类型库



我有一个.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。什么的...

无论如何,问题解决了。

相关内容

  • 没有找到相关文章

最新更新