您不必在桌面小工具中为 .net 代码使用基于反射的程序集加载器,您可以使用类 id 等将程序集编写为 com 可见的。 本文提供了使用 .net 来实现您的目标的示例'正在尝试不使用“适配器”。
话虽如此,您应该注意基于 activex 的桌面小工具的各种问题:
- 在小工具中创建 ActiveX 实例时,程序集 dll 将被 sidebar.exe “锁定打开”,并且即使在小工具已关闭后也无法删除该文件。不幸的是,小工具卸载过程没有考虑到这一点,卸载小工具将导致 sidebar.exe 在删除程序集失败时退出文件删除,留下程序集和任何其他未删除的剩余文件删除到那时。也没有显示错误消息。覆盖小工具(例如使用新版本)也是如此 - sidebar.exe 会在安装新的小工具包之前尝试完全删除该文件夹,这在大多数情况下会导致安装失败。
- 注册这样一个 activex 控件可能非常棘手。例如,您提供的 CodeProject 文章中给出的注册表脚本不适用于我的 Windows 7 x64。解决此问题的唯一方法是使用 WMI 写入注册表。
- 以类似的方式,注销 ActiveX 控件也是一个问题。当用户卸载小工具时,会留下注册表项。我想对很多人来说这不是问题,但想象一下,一个小工具爱好者尝试了他发现的每一个小工具,突然发现许多未使用的注册表项。您可以通过在实例化对象后直接删除注册表项来解决此问题(因为它无论如何都被侧边栏进程缓存)并在下次启动时再次重新注册它。
因此,尽管您可以在没有反射的情况下执行此操作,但使用反射可能是一个更好的选择,因为您可以将适配器程序集复制到另一个文件夹,使用它来加载当前程序集,然后在小工具关闭或完成使用时卸载它。这消除了无法卸载小工具的第一个问题,因为托管程序集位于不同的文件夹中,并且无论如何关闭小工具时都会卸载反映的程序集。
facebook.dll 没有加载的原因是因为您使用的加载器没有正确解决依赖关系(它找不到文件,因为它不知道在哪里查找)。欢迎您试用我们名为 PluginLoader 的基于反射的程序集加载器,看看它是否有效。我们还没有正式发布它,但我们打算让它广泛可用并推荐给所有开发人员使用,以尝试消除 ActiveX 和 Windows 桌面小工具的问题。因为我们还没有正式发布它,所以你必须安装我们的小工具,拍卖边栏工具,它将安装插件加载器,以便使用以下代码:
var plLoader = new ActiveXObject("Sidebar.PluginLoader");
var myLibrary = plLoader.LoadAssembly(classToLoad,
System.Gadget.path+"\\path\\to\\MyLibrary.dll");
myLibrary.GetFaceBookFeeds();
其中要加载的类是您需要以 Namespace.Class 格式(即MyLibrary.MyClass)加载的类。我们专门对其进行了编码以正确解决任何依赖关系,因此它应该适合您。如果它对您有用,欢迎您将它包含在您的小工具中。您只需要 AuctionSidebarTool 文件夹中的 PluginLoader.js 和 PluginLoader.dll 文件,但您需要编辑 PluginLoader.js 文件以删除引用我们程序集的部分(从第 110 行开始)。如果您在项目中包含它,它将检查现有的 PluginLoader.dll,如果失败,它会将其复制到本地 AppData 中的 Windows Sidebar 文件夹,注册它并为AddInLoader
对象提供方法LoadAssembly
和UnloadAssembly
. 如果您需要任何额外的帮助,请在评论中告诉我。
Hope that helps. That's probably the longest answer I've written so far on SO :)