动态调用程序集的复杂 API 问题

问题描述 投票:0回答:2

我有一个有趣的挑战,我想知道这里是否有人可以给我一些指导。

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

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

我可以使用 API 创建程序集,将文件复制到本地硬盘驱动器中的文件夹,并将我的应用程序配置为使用反射从实现的接口 (IDataManipulate.Execute) 调用特定函数。


问题:

由于应用程序将安装在网络中的多个工作站中,因此不可能将用户创建的插件 dll 复制到每台计算机。

我尝试过的解决方案:

解决方案1
将 API dll 复制到网络共享。

问题:
需要AllowPartiallyTrustedCallersAttribute,这需要.Net 唱歌,我不能强迫我的用户这样做。

解决方案2(首选)
序列化 dll 对象,将其保存到数据库,反序列化并调用 IDataManipulate.Execute。

问题:
反序列化后,我尝试将其转换为 IDataManipulate 对象,但在查找实际 dll 文件时返回错误。

解决方案3
将 dll 字节以 byte[] 的形式保存到数据库中,并在每次用户启动我的应用程序时在本地 PC 上重新创建 dll。

问题:
Dll可能有依赖关系,我不知道我是否能检测到。


如有任何建议,我们将不胜感激。

.net plugins reflection assemblies
2个回答
1
投票

我以前做过“解决方案3”。我们将 DLL 文件存储在带有“上次修改”时间戳的数据库表中。这样您就可以在应用程序启动时判断本地文件是否需要更新。

您可以调用 Assembly.GetReferencedAssemblies 从程序集中获取依赖项列表。这假设插件 DLL 不使用反射来动态加载随机程序集,但这应该是可以接受的。

另一种选择是使用 AppDomain.AssemblyResolve 事件。此事件不会让您在启动时下载所有插件 DLL,而是只下载实际需要的 DLL。


0
投票

您可以将它们复制到网络共享,然后当您的应用程序启动或需要加载插件时,您可以将日期与本地保存的日期进行比较,如果较新,则将其复制到本地..

© www.soinside.com 2019 - 2024. All rights reserved.