2010-05-12 70 views
0

我需要访问COM vtable,它们具有在C#中某些特定接口下暴露于外部世界的那些函数的条目。如何访问COM vtable并从C#中的TLB(类型库)获取条目?

我访问并遍历了TLB中包含的类型LoadTypeLibITypeInfo

现在我只需要在COM接口的vtable里面逐一访问那些方法,并且需要在RUNTIME中逐一调用它们。

我需要COM vtable地址及其索引条目(即函数地址)。

+0

可能的重复[如何通过阅读联合类的vtable获取函数名称与函数地址?](http://stackoverflow.com/questions/2432035/how-to-get-function-name-against-函数地址 - 读 - 共 - 类 - 虚表) – 2010-05-12 15:38:38

回答

0

您可以使用TlmImp.exe程序从TLB创建一个C#包装器。有关更多信息,请参阅How to: Generate Primary Interop Assemblies Using Tlbimp.exe

例如tlbimp LibUtil.tlb /primary /keyfile:CompanyA.snk /out:LibUtil.dll

编辑:反映评论。

由于C#代码始终运行在CLR 任何对非托管世界的调用都需要正确编组。你有

(一)允许的只是在做互操作,或者生成的包装选项

(b)您可以通过优化包装你的自我。 (c)你可以做的另一件事是将你的oen包装器写入托管的C++,然后直接通过vtable调用。我怀疑这会给你一个非常低的通话费用。 (d)最后的选择是只编写一个具有单一功能的简单非托管c dll,并使用P/Invoke直接从托管代码中调用该dll。

+0

这将产生更多的代码,我不需要?我不需要代码来处理。我需要在.NET中运行时调用COM未经管理的暴露方法。这需要拉出并提取所有信息(例如,运行时的函数及其地址)。我已经通过解析类型库(tlb)获得了所有函数名称及其参数(参数)。 现在我需要知道EXPOSED FUNCTION ADDRESS以便我可以在运行时调用某个接口的EXPOSED方法。 – Usman 2010-05-12 12:03:22

+0

在RUNTIME(知道方法的名称和参数),在.NET中,除了地址之外还有其他地方需要在RUNTIME调用吗? 我们是否需要在.NET中为每个函数调用编写marshaller? Wot about Dispatch.Invoke?它会有帮助吗? – Usman 2010-05-12 12:36:55

+0

.NET代码在托管空间中运行。你需要把每一个电话都打出来。你不能只发出一个jmp。我建议减少大写字母将使您更容易做好评论。 – 2010-05-12 12:49:14