NHibernate无法解析从子目录

时间:2018-06-26 13:10:06

标签: nhibernate .net-core nhibernate-mapping

//格式化不正确。

使用以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)

1 个答案:

答案 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; }
        }
    }
}