2

我正在开发一个 Windows 7 小工具。我正在创建一个 activex 对象并加载程序集。我正在遵循codeproject (GadgetInterop) 中提到的方法。该小工具的任务之一是与 Facebook 交互。

这就是我引用的方式:Javascript 创建一个 GadgetBuilder 对象。从这里我加载我的图书馆。说“MyLibrary.dll”。

  • 当我调用方法说 MyLibrary.GetCount(),(只返回一些整数)它工作。
  • 但是当我在方法中调用一些 facebook 函数时说 MyLibrary.GetFaceBookFeeds() 它会抛出一个错误。我从CodePlex引用“facebook.dll”

如果我从 ASP.NET 表单测试我的代码,它会完美运行。但是,当我通过尝试使用 javascript 加载它从我的 html 页面运行它时,我收到以下错误:

无法加载文件或程序集 'facebook, Version=2.1.3654.38113, Culture=neutral, PublicKeyToken=null' 或其依赖项之一。该系统找不到指定的文件。

我验证了 dll 与“MyLibrary.dll”在同一个文件夹中。

  1. 为什么会出现这个错误?
  2. 我该如何完成我的任务?(我需要使用从 javascript 调用 dll,因为我们在 dll 中做了很多其他事情)。
4

1 回答 1

1

您不必在桌面小工具中为 .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对象提供方法LoadAssemblyUnloadAssembly. 如果您需要任何额外的帮助,请在评论中告诉我。

Hope that helps. That's probably the longest answer I've written so far on SO :)

于 2010-01-05T13:52:04.483 回答