使用javascript从Com Visible dll调用.net dll时出错

时间:2010-01-04 16:45:43

标签: c# .net javascript activex windows-desktop-gadgets

我正在开发一个Windows 7小工具。我正在创建一个activex对象并加载程序集。我正在关注codeproject(GadgetInterop)中提到的methodlogy。该小工具的任务之一是与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中做了很多其他的事情。)

1 个答案:

答案 0 :(得分:1)

您不必在桌面小工具中使用基于反射的程序集加载器来编写.net代码,您可以使用类ID等编写程序集以使其可见。This article提供了一个使用示例.net在没有“适配器”的情况下实现你想要做的事情。

话虽如此,基于activex的桌面小工具存在各种问题,您应该注意:

  • 在小工具中创建ActiveX实例时,sidebar.exe将“锁定打开”程序集dll,即使小工具已关闭,也无法删除该文件。不幸的是,小工具卸载过程没有考虑到这一点,并且卸载小工具将导致sidebar.exe在删除程序集失败时退出文件删除,留下程序集和任何其他尚未删除的文件删除到那一点。也没有显示错误消息。覆盖小工具(例如,使用新版本)也是如此 - sidebar.exe尝试在安装新小工具包之前完全删除该文件夹,导致大多数情况下安装失败。
  • 注册这样的activex控件可能非常棘手。例如,您提供的CodeProject文章中提供的注册表脚本在我的Windows 7 x64上不起作用。解决此问题的唯一方法是使用WMI写入注册表。
  • 以类似的方式,取消注册ActiveX控件也是一个问题。当用户卸载小工具时,将留下注册表项。对于我想的很多人来说这不是问题,但想象一个小工具爱好者尝试他发现的每个小工具突然发现许多未使用的注册表项。您可以通过在实例化对象后直接删除注册表项来解决此问题(因为它始终由侧边栏进程缓存)并在下次启动时再次重新注册它。

因此,尽管你可以在没有反射的情况下做到这一点,但使用反射可能是更好的选择,因为您可以将适配器组件复制到备用文件夹,使用它来加载当前程序集,然后在小工具关闭或完成时卸载它使用它。这消除了第一个无法卸载小工具的问题,因为主机程序集位于不同的文件夹中,并且无论如何在小工具关闭时卸载反射的程序集。

facebook.dll未加载的原因是因为您使用的加载程序无法正确解析依赖项(它无法找到该文件,因为它不知道在哪里查找)。欢迎您尝试使用名为PluginLoader的基于反射的程序集加载器,看看是否有效。我们还没有正式发布它,但我们打算让它广泛使用,并建议所有开发人员使用它来尝试消除ActiveX和Windows桌面小工具的问题。因为我们还没有正式发布它,所以你必须安装我们的小工具Auction Sidebar Tool,它将安装插件加载器,可以使用以下代码:

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对象提供方法{ {1}}和LoadAssembly。如果您需要任何额外的帮助,请在评论中告诉我。

希望有所帮助。这可能是我迄今为止写的最长的答案:)