【问题标题】:Loading assemblies dynamically‏ AssemblyResolve issue动态加载程序集‏ AssemblyResolve 问题
【发布时间】:2011-02-23 06:35:12
【问题描述】:

注意: 这是我之前帖子的延续: Complicated API issue with calling assemblies dynamically‏


我正在编写一个在网络上运行并使用 SQL Server 保存和提取数据的 .Net Windows 窗体应用程序。

我想提供一个迷你“插件”API,开发人员可以在其中构建自己的程序集并实现特定接口 (IDataManipulate)。然后,我的应用程序可以使用这些程序集来调用 IDataManipulate.Execute()。

我决定采用解决方案 #3:

每次用户启动我的应用程序时,将 dll 字节作为 byte[] 保存到数据库并在本地 PC 上重新创建 dll。

这就是我正在做的事情:

  • 我的应用程序提示用户上传实现我的 API 接口 (IDataManipulate) 的 .Net 程序集(“主”程序集)并将字节保存在数据库中。
  • 然后,使用 Assembly.GetReferencedAssemblies 我得到一个引用程序集的列表并将它们的字节保存在数据库中(“引用”程序集),假设用户在同一文件夹中提供了实际文件。
    问题:如何从 Assembly.GetReferencedAssemblies 列表中识别系统程序集并排除它们?
  • 当应用程序运行时,我从数据库中获取主程序集的字节,使用 Assembly.Load(byte[]) 创建程序集并使用 CreateInstance(type),其中 type 是实现 IDataManipulate 的对象(所以我可以调用 IDataManipulate.Execute())。
  • 然后我使用 AppDomain.AssemblyResolve 事件使用 Aseembly.Load(byte[]) 从数据库加载引用程序集的字节

一切正常; dll 已加载,我可以调用 IDataManipulate.Execute() 除了这个问题:

问题

当我从主程序集中调用 IDataManipulate.Execute() 时,我收到一个错误,例如“我无法从该程序集中加载类型 xxxx”。无法加载的类型属于引用的程序集之一,而不是主程序集。

为什么会这样?

有什么建议吗?

谢谢

【问题讨论】:

    标签: .net api reflection plugins assemblies


    【解决方案1】:

    要回答您的第一个问题,您可以检查引用程序集的位置,如果它位于同一文件夹中,则仅将其添加到数据库中。

    【讨论】:

    • 这是个好主意.. 从没想过要使用 Location 属性。我正在寻找一种方法来提示用户未复制的程序集。谢谢。
    【解决方案2】:

    有点晚了,不过你也可以检查一下程序集的PublicKeyToken。我相信 .net 存在三个令牌。您可以通过查看 windows 框架文件夹来找到它们。这样,您可以根据需要将程序集包含在其他文件夹中。

    也就是说,我可能会要求开发人员也将它们放在同一个文件夹中。如果他们决定包含大型 3rd 方库,例如 Infragistics 或诸如此类。这样,他们必须在导入之前明确地将程序集移动到一个文件夹中,让他们知道自己在做什么。

    【讨论】:

      猜你喜欢
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      相关资源
      最近更新 更多