//格式化不正确。
使用以nhibernate和.net核心编写的nopcommerce插件,每个插件都包含其自己的实体目录,但是当NHibernate配置失败时
var cfg = new Configuration();
cfg.Configure(CommonHelper.MapPath("~/App_Data/db/defauls.config"));
// error here
cfg.AddAssembly("plugins assembly name");
FileNotFoundException:无法加载文件或程序集“ 插件程序集名称 ”或其依赖项之一。系统找不到指定的文件。
System.Reflection.RuntimeAssembly._nLoad(AssemblyName文件名,字符串代码,证据程序集安全性,RuntimeAssembly locationHint,ref StackCrawlMark stackMark,IntPtr pPrivHostBinder,bool throwOnFileNotFound,bool forIntrospection,bool detectInSecurity,布尔抑制安全检查) MappingException:持久类“ 插件程序集名称 。Entities.class名称, 插件程序集名称 未找到
NHibernate.Cfg.XmlHbmBinding.Binder.ClassForFullNameChecked(字符串fullName,字符串errorMessage) MappingException:无法编译映射文档: 插件程序集名称 。Entities.classname.hbm.xml
NHibernate.Cfg.Configuration.LogAndThrow(Exception exception)
答案 0 :(得分:0)
假设Plugin.Shop.dll位于插件Plugin.Shop.Entities文件夹的根文件夹中。 从属性中选择内容类型作为“嵌入式资源” 并提供此DLL的引用,并从属性中将其设置为False,以复制出文件夹。
这是EmbeddedAssembly.cs文件
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Security.Cryptography;
namespace Plugin.Shop.Entities
{
public class EmbeddedAssembly
{
// Version 1.0
static Dictionary<string, Assembly> dic = null;
public static void Load(string embeddedResource, string fileName)
{
if (dic == null)
dic = new Dictionary<string, Assembly>();
byte[] ba = null;
Assembly asm = null;
Assembly curAsm = Assembly.GetExecutingAssembly();
using (Stream stm = curAsm.GetManifestResourceStream(embeddedResource))
{
// Either the file is not existed or it is not mark as embedded resource
if (stm == null)
throw new Exception(embeddedResource + " is not found in Embedded Resources.");
// Get byte[] from the file from embedded resource
ba = new byte[(int)stm.Length];
stm.Read(ba, 0, (int)stm.Length);
try
{
asm = Assembly.Load(ba);
// Add the assembly/dll into dictionary
dic.Add(asm.FullName, asm);
return;
}
catch
{
// Purposely do nothing
// Unmanaged dll or assembly cannot be loaded directly from byte[]
// Let the process fall through for next part
}
}
bool fileOk = false;
string tempFile = "";
using (SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider())
{
string fileHash = BitConverter.ToString(sha1.ComputeHash(ba)).Replace("-", string.Empty); ;
tempFile = Path.GetTempPath() + fileName;
if (File.Exists(tempFile))
{
byte[] bb = File.ReadAllBytes(tempFile);
string fileHash2 = BitConverter.ToString(sha1.ComputeHash(bb)).Replace("-", string.Empty);
if (fileHash == fileHash2)
{
fileOk = true;
}
else
{
fileOk = false;
}
}
else
{
fileOk = false;
}
}
if (!fileOk)
{
System.IO.File.WriteAllBytes(tempFile, ba);
}
asm = Assembly.LoadFile(tempFile);
dic.Add(asm.FullName, asm);
}
public static Assembly Get(string assemblyFullName)
{
if (dic == null || dic.Count == 0)
return null;
if (dic.ContainsKey(assemblyFullName))
return dic[assemblyFullName];
return null;
}
}
}
这是依赖项注册文件
using Autofac;
using Autofac.Core;
using Nop.Core.Configuration;
using Nop.Core.Data;
using Nop.Core.Infrastructure;
using Nop.Core.Infrastructure.DependencyManagement;
using Nop.Data;
using Nop.Web.Framework.Mvc;
using System;
using System.Reflection;
namespace Plugin.Shop.Entities.Infrastructure
{
/// <summary>
/// Dependency registrar
/// </summary>
public class DependencyRegistrar : IDependencyRegistrar
{
public virtual void Register(ContainerBuilder builder, ITypeFinder typeFinder, NopConfig config)
{
builder.RegisterType<NameService>().As<INameService>().InstancePerLifetimeScope();
string codeDll = "Plugin.Shop.Entities.Plugin.Shop.dll";
EmbeddedAssembly.Load(codeDll, "Plugin.Shop.dll");
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
}
private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
return EmbeddedAssembly.Get(args.Name);
}
public int Order
{
get { return 1; }
}
}
}