MSBuild任务来构建加载我的程序集并构建序列化的NHibernate配置



我原本希望是一两个小时的工作,现在却变成了一场彻底的失败,看不到任何结果。

问题:我正试图序列化我的NHibernate配置的副本并将其存储在…用于生成它的项目!

当前手动解决方案:我有一个项目Foo

  • 包含一系列DomainObject.Map.cs文件
  • 引用一个"nhconfig.bin"文件作为资源嵌入。
  • 包含一个静态方法FooGenerateNHConfig,用于创建一个Configuration对象并将其序列化到nhconfig.bin。

生成它,I:

  1. (仅第一次:创建一个空的nhconfig.bin作为占位符)。
  2. 构建Foo。
  3. 调用一个单元测试调用FooGenerateNHConfig
  4. 重建Foo。
  5. 部署的应用程序。

我正在尝试自动化这个,并认为这将是一个简单的问题:

  1. 创建项目Foo
  2. 定义一个任务X,它将调用FooGenerateNHConfig。
  3. 设置调用x的AfterCompile目标。

不幸的是,我现在得到2个错误。

  1. 首先,有点奇怪的例外:

    FluentNHibernate.Cfg.FluentConfigurationException: An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.
    ---> System.Runtime.Serialization.SerializationException: Unable to find assembly 'FluentNHibernate, Version=1.1.0.685, Culture=neutral, PublicKeyToken=8aa435e3cb308880'.
    

    我认为这是FluentNHibernate抱怨它找不到FluentNHibernate程序集?

  2. 一旦我从visual studio第一次运行任务,visual studio (devenv.exe)锁定了我的Foo.BuildSupport.dll和我的Foo.exe(大概是因为它只是把它们看作支持库而不是实际的构建库),所以我不能重建它们。通常,这是因为vs假设(可能是正确的)BuildSupport库是相当静态的,不依赖于

使这样一个过程自动化的好方法是什么?我现在只有一些初步的想法,但我唯一能想到的是建立一个完全独立的可执行文件由msbuild运行(看到一个任务来做这个等价的,现在找不到它),或者一些相当涉及到一个单独的应用程序域,并通过反射手动调用函数。但在我继续沿着这条路走下去之前,我是否错过了一些更容易、更明显的东西?

我遇到了一个非常类似的问题。我的问题与MSBuild将Xml反序列化为第三方程序集中包含的类有关。它无法解析序列化工作所需的程序集,即使这些程序集是项目的一部分,并且在序列化之外解析它们没有问题。不能给出比这更技术性的问题描述,但我发现这段代码为我解决了这个问题,

        static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            Assembly ayResult = null;
            string sShortAssemblyName = args.Name.Split(',')[0];
            Assembly[] ayAssemblies = AppDomain.CurrentDomain.GetAssemblies();
            foreach (Assembly ayAssembly in ayAssemblies)
            {
                if (sShortAssemblyName == ayAssembly.FullName.Split(',')[0])
                {
                    ayResult = ayAssembly;
                    break;
                }
            }
            return ayResult;
        }
        public Constructor()
        {
            AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
        }

我认为这对我有用的原因是因为我的应用程序在序列化之外解决了程序集,所以我覆盖了AssemblyResolution callout,将其指向它出于某种原因不会自己使用的好程序集。

希望这是有用的!

最新更新