如何将dll加载到ram中并让其可以被另一个已加载到ram中的dll访问

时间:2016-10-16 08:41:35

标签: c# .net wpf dll

我有一个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中使用我的绑定标记...

欢迎任何方法/想法。

感谢

1 个答案:

答案 0 :(得分:2)

如果在调用Activator.CreateInstace之前加载两个程序集,则代码将起作用。无论你的dll是通过Assembly.Load从硬盘还是字节数组加载,它都不会对运行时产生影响,所以如果事先了解所有依赖项,你可以预加载所有这些依赖项。

如果您不知道运行时需要哪些程序集,您可以随时订阅AppDomain.AssemblyResolve事件并仅下载请求的dll。