先将类库引用至程序中,
再将所引用的类库设置为不复制到本地。
然后将类库添加到项目的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];
}