【问题标题】:how to load a dll into ram and have it accessible by another dll that has been loaded into ram如何将 dll 加载到 ram 中并让另一个已加载到 ram 中的 dll 访问它
【发布时间】:2016-10-16 08:41:35
【问题描述】:

我有一个 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");

现在在我的“原始”应用程序中,我的视图将通过其引用从我的 Biz.Dll 调用逻辑。

但在这种情况下,DLL 被加载到 RAM 而不是用户硬盘中。 那么,我的视图(已加载到 RAM)是否可以调用 Biz.Dll 中的方法(也加载到 RAM)而不将 DLL 写入用户硬盘驱动器?

我采用这种方法的原因是我希望在任何用户的 PC 上都占用很小的物理空间并控制对代码的访问。因此,每当用户启动应用程序时,它总是会获得最新版本,我可以控制应用程序的注册。

我知道我可以将所有主要逻辑移动到我的服务器上,但我并没有试图保护我的代码,而且我希望即使用户无法获得良好的(即暂时中断的)互联网连接,该应用程序仍然可以运行。我从客户端“缓存”所有服务器更新,并在有连接时更新。

我可以重新设计我的代码以进行后期绑定调用,但我不知道这将如何与我的 xaml 中的绑定标记一起工作..

欢迎任何方法/想法。

谢谢

【问题讨论】:

    标签: c# .net wpf dll


    【解决方案1】:

    如果您在调用Activator.CreateInstace 之前加载这两个程序集,您的代码将起作用。无论您的 dll 是通过Assembly.Load 从硬盘加载还是字节数组加载,运行时都没有区别,因此如果您事先知道所有依赖项,则可以预加载所有依赖项。

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

    【讨论】:

    • 您好,感谢您的回答。这很有道理。我以为我将不得不在 dll 之间使用 Kate 绑定。谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多