WPF 嵌入类库至应用程序中

先将类库引用至程序中,

再将所引用的类库设置为不复制到本地。

然后将类库添加到项目的Properties的资源文件(Resources.resx)中

添加到资源文件中

找到需要添加的类库 添加 

添加后在解决方案中会生成一个Resources的文件夹

在文件夹中 选中类库 设置生成操作为嵌入的资源。

然后在app.xaml中添加

public App()
{
    AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
}

private System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            //将加载失败的程序集定位到Resources文件夹中
            string resourceName = "PDFtoOffice.Resources." + new AssemblyName(args.Name).Name + ".dll";
            //从程序集中获取资源清单
            using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
            {
                if (stream == null) return null;//若为找到程序集则返回空
                byte[] assemblyData = new byte[stream.Length];
                //读取程序集内容
                stream.Read(assemblyData, 0, assemblyData.Length);
                //加载程序集
                return Assembly.Load(assemblyData);
            }
        }

当程序及加载失败时,程序就会触发此事件  根据给定的路径去寻找dll,再动态地载入dll。

但是在持续使用中发现,加载的程序集不会一直保持在运行的程序中,每次调用dll中的资源时,都会重新载入。

这样在使用自定义的类库时,无论是静态的资源,还是使用单例模式加载资源都会被不断释放掉,导致需要重新加载。引发“无效赋值”。从而出现程序上的错误。

Dictionary<string, Assembly> AssemblyList = new Dictionary<string, Assembly>();
        readonly object _lock = new object();
        private System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            string AssemblyName = new AssemblyName(args.Name).Name;
            if (AssemblyList.ContainsKey(AssemblyName)) return AssemblyList[AssemblyName];
            lock (_lock)
            {
                if (!AssemblyList.ContainsKey(AssemblyName))
                {
                    //将加载失败的程序集定位到Resources文件夹中
                    string resourceName = "PDFtoOffice.Resources." + new AssemblyName(args.Name).Name + ".dll";
                    //从程序集中获取资源清单
                    using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
                    {
                        if (stream == null) return null;//若为找到程序集则返回空
                        byte[] assemblyData = new byte[stream.Length];
                        //读取程序集内容
                        stream.Read(assemblyData, 0, assemblyData.Length);
                        //加载程序集
                        AssemblyList[AssemblyName] = Assembly.Load(assemblyData);
                    }
                }
            }
            return AssemblyList[AssemblyName];
        }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值