在COM DLL和C#之间进行通信

时间:2009-05-12 19:14:30

标签: c# .net dll com shell-extensions

我前几天询问了question有关叠加图标的问题。在帮助下,我想出了如何实现这一目标。

以下是图标叠加的工作原理(据我所知):在shell绘制图标之前,它会联系系统中的所有图标叠加处理程序,以确定是否应该在该特定图标上绘制叠加层。

我的设置:
我有一个注册的Shell扩展(图标叠加处理程序),我想用它来显示图标叠加。此外,我有一个.NET应用程序(C#)将写入数据库(SQLite,很可能),其中包含我要显示覆盖的所有文件和文件夹的名称等。

我的问题是:
如何让Shell扩展(我认为它基本上是一个COM DLL)回调到我的.NET应用程序?或者这有点过分,我应该直接从数据库中读取Shell扩展吗?

可能的解决方案?

  1. 让Shell扩展(图标覆盖处理程序)读取数据库并确定是否显示叠加。
  2. 让Shell扩展程序回调到.NET应用程序以确定是否显示叠加层。
  3. 我希望这是有道理的,如果没有,我会试着详细说明。

2 个答案:

答案 0 :(得分:2)

COM DLL无法直接与.NET程序集通信。您可能需要expose your .NET assembly as COM object并与此COM对象交谈。但事实上,这可能对您的情况来说太过分了。另一个选择是将与.NET程序集中的数据库对话的功能公开为可以从shell扩展中调用的一些可互操作的服务(WCF?)。

答案 1 :(得分:2)

是的,如果您将程序集标记为COM可见并运行regasm,那么您的COM DLL可以导入生成的类型库并调用CoCreateInstance以获取对.NET类的引用。

但是,它有点scary to pull the .NET framework into a shell extension。因此,您可能希望确保在进程外调用.NET代码...即CLSCTX_LOCAL _SERVER到CoCreateInstance。