C# 找不到具有BinaryFormatter的程序集。请反序列化

C# 找不到具有BinaryFormatter的程序集。请反序列化,c#,deserialization,C#,Deserialization,我希望你能帮助我 我正在反序列化一个自定义对象,我得到了这个错误。 该类型位于dll中,该dll使用windows钩子加载,因此在explorer.exe下运行 我理解为什么会发生此错误,这是因为DLL不驻留“explorer.exe”进程。 有两种解决方案: 1.将组件安装到GAC中 2.使用二进制格式化程序的“活页夹” 我不想使用其中任何一个,因为DLL实际上是在explorer.exe中加载的(当我附加时,我看到DLL确实加载了) 我正在序列化一个自定义对象-在反序列化的同一个DLL中创建

我希望你能帮助我

我正在反序列化一个自定义对象,我得到了这个错误。 该类型位于dll中,该dll使用windows钩子加载,因此在explorer.exe下运行

我理解为什么会发生此错误,这是因为DLL不驻留“explorer.exe”进程。 有两种解决方案: 1.将组件安装到GAC中 2.使用二进制格式化程序的“活页夹”

我不想使用其中任何一个,因为DLL实际上是在explorer.exe中加载的(当我附加时,我看到DLL确实加载了)

我正在序列化一个自定义对象-在反序列化的同一个DLL中创建

这是我的代码:

     BinaryFormatter binaryFormatter = new BinaryFormatter();
     byte[] serializedObject;


        using (MemoryStream memoryStream = new MemoryStream())
        {
           binaryFormatter.Serialize(memoryStream, new MyCustomObject());
           serializedObject = memoryStream.ToArray();
        }
      BinaryFormatter binaryFormatter2 = new BinaryFormatter();
      object deserializedObject;
        using (MemoryStream memoryStream2 = new MemoryStream(serializedObject))
        {
           deserializedObject = binaryFormatte2r.Deserialize(memoryStream2); // Unable to find this assembly
        }
顺便说一下。我查看了一下二进制格式化程序代码,它确实尝试加载DLL。。但是它已经加载到进程中了

错误:

Unable to find assembly 'AssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=Key'.

stack trace:
   at System.Runtime.Serialization.Formatters.Binary.BinaryAssemblyInfo.GetAssembly()
   at System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetType(BinaryAssemblyInfo assemblyInfo, String name)
   at System.Runtime.Serialization.Formatters.Binary.BinaryConverter.TypeFromInfo(BinaryTypeEnum binaryTypeEnum, Object typeInformation, ObjectReader objectReader, BinaryAssemblyInfo assemblyInfo, InternalPrimitiveTypeE& primitiveTypeEnum, String& typeString, Type& type, Boolean& isVariant)
   at 
System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadArray(BinaryHeaderEnum binaryHeaderEnum)
   at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()
   at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
   at 
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
   at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream)
--编辑--


我正在使用名称空间扩展(因此操作系统将挂钩到我的DLL)

为时已晚,但我的解决方案如下所示。BindToType的实现被重写以解决您的问题

[Serializable]
public class YourClass : SerializationBinder 
{
    public override Type BindToType(string assemblyName, string typeName)
    {
        Type tyType = null;
        string sShortAssemblyName = assemblyName.Split(',')[0];

        Assembly[] ayAssemblies = AppDomain.CurrentDomain.GetAssemblies();

        foreach (Assembly ayAssembly in ayAssemblies)
        {
            if (sShortAssemblyName == ayAssembly.FullName.Split(',')[0])
            {
                tyType = ayAssembly.GetType(typeName);
                break;
            }
        }
        return tyType;
    }
    ...

您的代码有些混乱。这真的是一个连续的代码块吗?如果是这样的话,那就没什么意义了。不是真的,只是部分代码(我们有一个序列化管理器)。i_DataToSerialize应该是“serializedObject”,事实上,我将更改您是否在同一AppDomain中序列化和期望序列化?该程序集似乎已经加载。这不可能是该程序集的加载程序问题(您同意吗?)。看看别的地方。可能您误解了错误消息(发布完整的异常)。或者,这实际上是关于一个与您想象的不同的程序集。序列化的blob是从您尝试反序列化它的完全相同的二进制程序集生成的吗?可能版本或密钥已更改。加载的程序集是否准确命名为
AssemblyName,Version=1.0.0,Culture=neutral,PublicKeyToken=Key
?我们最终使用了绑定器,但使用的方式更简单:public override Type BindToType(string i_AssemblyName,string i_TypeName){Type typeToDeserialize=Type.GetType(string.Format(“{0},{1}”,i_TypeName,i_AssemblyName));返回typeToDeserialize;}我将标记您的答案,谢谢!