我有一个WPF桌面应用程序。
我的想法是:
我安装的应用程序启动并连接到我的服务器。
客户端应用程序然后将我的视图和DLL逻辑/资源加载到RAM中。
我就是这样做的:
var uri = "http://127.0.0.1/Dll/MyControls.Dll";
var data = new System.Net.WebClient().DownloadData(uri);
var ViewAssembly = System.Reflection.Assembly.Load(data);
foreach (Type type in ViewAssembly.GetExportedTypes())
{
if (type.FullName.IndexOf(".Plugin") > 0)
{
dynamic obj = Activator.CreateInstance(type);
UserControl wnd = obj.GetControl();
MainContent.Children.Add(wnd);
break;
}
}
uri = "http://127.0.0.1/Dll/Biz.Dll";
data = new System.Net.WebClient().DownloadData(uri);
var DLLAssembly = System.Reflection.Assembly.Load(data);
Type myType = DLLAssembly.GetType("Biz.Logic");
现在我的原作' application我的视图将通过它的引用从我的Biz.Dll调用逻辑。
但是在这种情况下,DLL被加载到RAM而不是用户硬盘驱动器。 那么,我的View(已加载到RAM中)是否可以调用Biz.Dll中的方法(也加载到RAM中)而不将DLL写入用户硬盘驱动器?
我的方法的原因是我希望在任何用户PC上占用很小的物理空间并控制对代码的访问。因此,每当用户启动应用程序时,它总是获得最新版本,我可以控制应用程序的注册。
我知道我可以将所有主要逻辑移动到我的服务器,但我并不是想保护我的代码,而且我希望应用程序仍能正常工作,即使用户无法获得良好(即暂时断开)的互联网连接。我正在缓存'来自我的客户端的所有服务器更新,当有连接时它会更新。
我可以重新设计我的代码以进行后期绑定调用,但我不知道如何在我的xaml中使用我的绑定标记...
欢迎任何方法/想法。
感谢
答案 0 :(得分:2)
如果在调用Activator.CreateInstace
之前加载两个程序集,则代码将起作用。无论你的dll是通过Assembly.Load
从硬盘还是字节数组加载,它都不会对运行时产生影响,所以如果事先了解所有依赖项,你可以预加载所有这些依赖项。
如果您不知道运行时需要哪些程序集,您可以随时订阅AppDomain.AssemblyResolve事件并仅下载请求的dll。