Windows Shell Extension带有C#和Shell名称空间扩展名。C#。C ,MFC,AT - 要使用什么?问我的一些问题,但它(和答案)已经超过两年了。我正在使用.NET 4.5 [.1]的Visual Studio 2013。我还阅读了实施程序内扩展的指南,其中包括其他问题列出了与运行时回调包装器的交互作用,这是不使用.NET用于Shell Extensions的原因。
我的想法是将C /CLI中的实际外壳接口作为本机C 类,但几乎将所有真实的工作传递给.NET。这将解决MSDN文章中引用的许多问题(例如RCW问题)?
代码可能符合:
的行namespace Managed { // C#
public interface IShellFolder { … mimic native IShellFolder in C# … }
}
#include <shobjidl.h>
class CShellFolder : public IShellFolder // C++/CLI
{
private: gcroot<Managed::IShellFolder> m_shellFolder;
};
hmya,这些问题已经足够真实,它读起来就像是对Microsoft在.NET程序员开始编写Shell Extensions时获得的支持调用的非常旧的采样。当然,他们做到了,.NET使他们更容易使它们前进。CLR非常隐藏了许多令人讨厌的com管道,以至于(几乎)完全看不见。这些问题不是.NET代码,STA重新输入和界面编制的独有的也不是本机代码中的一个问题。只要您知道自己在做什么,就足够易于避免。当然,这是.NET中的问题,您无法轻易找出它在做什么。它使它变得 Too 易于。
他们甚至没有提到最大的问题,很大的提示是旧的,CLR版本注射问题很难解决。对于一个,如果另一个 shell Extension也写在.NET中,则将CLR加载到Explorer中。如果此扩展程序使用的版本比您需要的较旧,则扩展名将无法加载,在尝试在无法加载组件的CLR上运行时会在火焰中降下。工作是在CLR V4中进行的,以避免这种情况,但它并不完美,这是一个旧的,它在其他所有人仍会导致失败之前加载。
,它不仅限于Explorer,还会在使用openfiledialog(例如OpenFileDialog)的常见窗口功能时将其外壳扩展名注入任何任何进程。编写可以将DLL注入任意过程而不会在此过程中引起麻烦的过程,这是需要用非常强大的希波克拉底誓言来接触的,尽管Shalt首先没有伤害。在整个CLR和抖动中拖动是一件非常无关紧要的事情。
这些失败极难诊断,Explorer在无法加载扩展时不会窥视。而死于注射代码的程序绝不可以看待任何东西。您会接到客户的电话,他会告诉您"它不起作用,帮助我"。或更糟糕的是,他将称其为您的扩展程序杀死的计划的所有者。那不是任何人都想回答的支持电话。
和您一样,微软也不想接听支持电话,不得不向从未远程听说过的程序员解释这些com详细信息。而且他们没有,在.NET中编写壳扩展程序是正式不支持的。您可以向前锻造并忽略不祥的措辞,但是如果您撞到墙壁,则无法致电Microsoft寻求帮助。不要指望从所以要么顺便说一句,壳扩展是一个晦涩的话题。