我面临一个有趣的挑战,我想知道这里是否有人可以给我一些指导。
我正在编写一个在网络上运行并使用 SQL Server 保存和提取数据的 .Net Windows 窗体应用程序。
我想提供一个迷你“插件”API,开发人员可以在其中构建自己的程序集并实现特定的接口(IDataManipulate)。然后,我的应用程序可以使用这些程序集来调用接口函数并执行某些操作。
我可以使用 API 创建程序集,将文件复制到本地硬盘驱动器中的文件夹,并将应用程序配置为使用反射来从实现的接口 (IDataManipulate.Execute) 调用特定函数。
问题:
由于应用程序将安装在网络中的多个工作站中,因此不可能将用户创建的插件 dll 复制到每台计算机上。
我尝试过的解决方案:
解决方案1
将 API dll 复制到网络共享。
Problem:
需要AllowPartiallyTrustedCallersAttribute,这需要.Net 唱歌,我不能强迫我的用户这样做。
解决方案2(首选)
序列化 dll 对象,将其保存到数据库,反序列化并调用 IDataManipulate.Execute。
Problem:
反序列化后,我尝试将其转换为 IDataManipulate 对象,但在查找实际 dll 文件时返回错误。
解决方案3
将 dll 字节以 byte[] 的形式保存到数据库中,并在每次用户启动我的应用程序时在本地 PC 上重新创建 dll。
Problem:
Dll可能有依赖关系,我不知道我是否能检测到。
任何建议将不胜感激。
Thanks
我以前做过“解决方案3”。我们将 DLL 文件存储在带有“上次修改”时间戳的数据库表中。这样您就可以知道应用程序启动时是否需要更新本地文件。
您可以致电Assembly.GetReferencedAssemblies http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getreferencedassemblies(VS.71).aspx从程序集中获取依赖项列表。这假设插件 DLL 不使用反射来动态加载随机程序集,但这应该是可以接受的。
另一种选择是使用AppDomain.AssemblyResolve http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx事件。此事件不会让您在启动时下载所有插件 DLL,而是只下载实际需要的 DLL。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)