我有一个有趣的挑战,我想知道这里是否有人可以给我一些方向。
我正在编写一个在网络上运行的.Net Windows窗体应用程序,并使用SQL Server来保存和提取数据。
我想提供一个迷你“插件”API,开发人员可以在其中构建自己的程序集并实现特定的接口(IDataManipulate)。然后,我的应用程序可以使用这些程序集调用接口函数并执行某些操作。
我可以使用我的API创建程序集,将文件复制到本地硬盘中的文件夹,并将我的应用程序配置为使用Reflection从已实现的接口调用特定函数(IDataManipulate.Execute)。
问题:
由于应用程序将安装在网络中的多个工作站中,因此无法复制用户将为每台计算机创建的插件dll。
我试过的解决方案:
解决方案1
将API dll复制到网络共享。
问题:
需要AllowPartiallyTrustedCallersAttribute,这需要.Net演唱,我不能强迫用户使用。
解决方案2 (首选)
序列化dll对象,将其保存到数据库,反序列化并调用IDataManipulate.Execute。
问题:
反序列化后,我尝试将其转换为IDataManipulate对象,但返回错误,查找实际的dll文件。
解决方案3
将dll字节保存为byte []到数据库,并在每次用户启动应用程序时在本地PC上重新创建dll。
问题:
DLL可能有依赖关系,如果我能检测到,我不知道。
任何建议都将不胜感激。
由于
答案 0 :(得分:1)
之前我做过“解决方案3”。我们将DLL文件存储在具有“最后修改”时间戳的数据库表中。这样,您可以判断应用程序启动时是否需要更新本地文件。
您可以调用Assembly.GetReferencedAssemblies从程序集中获取依赖项列表。这假设插件DLL不使用反射来动态加载随机程序集,但这应该是可接受的。
另一种选择是使用AppDomain.AssemblyResolve事件。而不是在启动时下载所有插件DLL,此事件将允许您只下载实际需要的DLL。
答案 1 :(得分:0)
您可以将它们复制到网络共享,然后当您的应用程序启动或者您需要加载插件时,您可以将日期与您在本地保存的日期进行比较,如果它更新,则将其复制到本地..