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

3

我前几天在关于覆盖图标的问题上发了一个问题。通过帮助,我弄清楚了如何使其正常工作。

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

我的设置:
我有一个已注册的Shell扩展名(图标叠加处理程序),我想使用它来显示图标叠加层。此外,我有一个.NET应用程序(C#),它将使用文件和文件夹的名称等写入数据库(最可能是SQLite),我要在这些文件和文件夹上显示图标叠加层。

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

可能的解决方案:

  1. 让Shell扩展名(图标叠加处理程序)读取数据库并确定是否显示叠加层。
  2. 让Shell扩展名回调到.NET应用程序以确定是否显示叠加层。

希望这有意义,如果不是,我会尽力解释。

2个回答

2

COM DLL无法直接与.NET程序集通信。您可能需要将您的.NET程序集公开为COM对象,并与该COM对象进行通信。但在您的情况下,这可能实际上是一种过度设计。另一个选项是将与数据库通信的功能公开为可互操作的服务(WCF?),可以从Shell扩展中调用。


1
你有什么建议?让COM DLL直接读取数据库是个不好的主意吗?这不就跟你第二个建议基本一样了吗(显然不完全一样,但功能上差不多)。 - Sean
1
Shell扩展与数据库通信将违反DRY原则,因为如果我理解正确,您已经在C#中编写了代码。因此,要么使用regasm.exe注册您的DLL并从Shell扩展调用它,要么将其公开为Web服务并使用此Web服务。 - Darin Dimitrov
1
好的,如果我对我的C# DLL进行注册,那么我可以从我的COM DLL与它通信吗? - Sean
1
与任何COM对象一样,正确处理即可。 - Darin Dimitrov
1
谢谢。我现在明白了。我刚刚让我的Shell扩展调用一个托管的dll(C#),它可以将两个数字相加! - Sean

2
是的,如果你将你的程序集标记为COM可见,并运行regasm,那么你的COM dll就可以导入生成的类型库并调用CoCreateInstance来获取对你的.NET类的引用。
然而,将.NET框架引入Shell扩展有点令人担忧。因此,你可能要确保.NET代码在进程外被调用...即使用CLSCTX_LOCAL_SERVER来调用CoCreateInstance。

1
我只是从我的.NET DLL中调用一个函数。但是,这个shell扩展是用非托管代码编写的。这仍然是一个问题吗? - Sean
1
是的,请确保这行代码最终传递 CLSCTX_LOCAL_SERVER 而不是 CLSCTX_INPROC_SERVER: HRESULT hRes = pDotNetCOMPtr.CreateInstance(MyInterop::CLSID_MyDotNetClass);这将导致您的托管代码在另一个进程中运行,从而避免它被拉入 explorer.exe。 - Skrymsli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接