Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Raven DB JsonSerializationException无法加载程序集_C#_Json.net_Ravendb - Fatal编程技术网

C# Raven DB JsonSerializationException无法加载程序集

C# Raven DB JsonSerializationException无法加载程序集,c#,json.net,ravendb,C#,Json.net,Ravendb,当我试图检索一个包含在动态加载的DLL中找到其类型的实体列表的文档时,我得到一个jsonSerialization异常,该异常表示它在动态加载的DLL中找不到该类型:无法加载程序集“Sandbox\u One” 我使用RavenDB(build 2681)来存储使用创建的实体,尽管我认为这不是一个问题。每个实体都继承一个非动态接口IEntity。Raven会话是在.NET MVC 4操作的任一侧创建的(根据),我可以将动态实体保存到IEntity列表中 当我试图从文档中加载实体列表时,会出现序列

当我试图检索一个包含在动态加载的DLL中找到其类型的实体列表的文档时,我得到一个
jsonSerialization
异常,该异常表示它在动态加载的DLL中找不到该类型:
无法加载程序集“Sandbox\u One”

我使用RavenDB(build 2681)来存储使用创建的实体,尽管我认为这不是一个问题。每个实体都继承一个非动态接口
IEntity
。Raven会话是在.NET MVC 4操作的任一侧创建的(根据),我可以将动态实体保存到
IEntity
列表中

当我试图从文档中加载实体列表时,会出现序列化错误。目前,我只有一个实体类型(客户)的单个实例(蓝眼睛)

观察
  • 在数据库中,实体的外观与我预期的完全相同:
控制器(我在加载实体的调用中加粗): NB
RavenSession
从基本控制器继承,与

引发异常的加载调用:

    public List<IEntity> GetDataForRealm(IDocumentSession session, Realm realm)
    {
        var realmData = session.Load<RealmData>(realm.RealmDataId); // Exception thrown
        return realmData.Entities;
    }
公共列表GetDataForRealm(IDocumentSession会话,领域领域)
{
var realmData=session.Load(realm.realmData);//引发异常
返回realmData.Entities;
}
领域数据类:

public class RealmData
{
    public RealmData()
    {
        Entities = new List<IEntity>();
    }
    public List<IEntity> Entities { get; set; }
}
公共类RealmData
{
公共RealmData()
{
实体=新列表();
}
公共列表实体{get;set;}
}

提前感谢您的帮助

我的解决方案是在应用程序域上实现一个
AssemblyResolve
事件处理程序

GetDataForRealm
方法变为:

public List<IEntity> GetDataForRealm(IDocumentSession session, Realm realm)
    {
        AppDomain.CurrentDomain.AssemblyResolve += (s, a) => MyResolveEventHandler(s, a, realm.Assembly);

        var realmData = session.Load<RealmData>(realm.RealmDataId);
        return realmData.Entities;
    }
我认为发生了什么:

当JSON.Net反序列化程序反映出动态类型时,它在
AppDomain.CurrentDomain
中找不到程序集。当
AppDomain
无法按名称找到程序集时,将调用该处理程序。我的程序集位于AppDomain中(我使用assembly.Load),但找不到它

注意: 我用一个额外的参数扩展了
myresolveventhandler
,因为我已经有了所需的程序集。如果内存中没有程序集(但知道它在哪里),则可以将其加载到
MyResovleEventHandler

更新 稍后,您可能会发现将数据分配给这些结果对象时遇到问题。这是因为通过
AppDomain
传递实体并不意味着它会更改对象的域。相反,它只是提供了一个参考。相反,我发现让RavenDB首先在正确的(临时的)域中使用一个自定义JSON转换器(在成员中有动态程序集)创建对象更容易

    public List<IEntity> GetDataForRealm(IDocumentSession session, Realm realm)
    {
        var realmData = session.Load<RealmData>(realm.RealmDataId); // Exception thrown
        return realmData.Entities;
    }
public class RealmData
{
    public RealmData()
    {
        Entities = new List<IEntity>();
    }
    public List<IEntity> Entities { get; set; }
}
public List<IEntity> GetDataForRealm(IDocumentSession session, Realm realm)
    {
        AppDomain.CurrentDomain.AssemblyResolve += (s, a) => MyResolveEventHandler(s, a, realm.Assembly);

        var realmData = session.Load<RealmData>(realm.RealmDataId);
        return realmData.Entities;
    }
private Assembly MyResolveEventHandler(object sender, ResolveEventArgs args, Assembly assembly)
    {
        if (assembly.GetName().Name == args.Name)
        {
            return assembly;
        }
        return null;
    }