2010-04-29 67 views
2

我有一个有趣的挑战,我想知道如果有人在这里可以给我一些方向。动态调用程序集时出现复杂的API问题

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

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

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


问题:由于应用程序将被安装在网络中的多个工作站

,是不可能复制插件DLLS用户将创建到每个机。

解决方案我想:

解决方案1 ​​
复制API DLL到网络共享。

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

溶液2(优选的)
序列化的dll对象,将其保存到数据库中,反序列化和呼叫IDataManipulate.Execute。

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

解决方案3个
保存到数据库的DLL字节的byte []和每次用户启动我的应用程序时重新创建DLL在本地PC上。

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


任何建议将不胜感激。

谢谢

回答

1

我已经完成了“解决方案3”之前。我们使用“上次修改时间”的时间戳将DLL文件存储在数据库表中。这样你就可以知道应用程序启动时是否需要更新本地文件。

您可以拨打电话Assembly.GetReferencedAssemblies以获取程序集中的依存关系列表。这假设插件DLL不使用反射来动态加载一个随机程序集,但这应该是可以接受的。

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

+0

@David,你是否尝试实施解决方案#2?因为如果我可以避免在运行时创建DLL,它将是理想的。 – 2010-04-29 16:40:43

+0

如果使用AssemblyResolve事件,则可以返回从任何流对象加载的程序集对象。这将允许您从数据库加载它,而不必先将其保存到磁盘。 – David 2010-04-29 17:58:29

0

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

相关问题