【问题标题】:Deserialize an object (dll-class)反序列化对象(dll 类)
【发布时间】:2011-10-31 10:21:38
【问题描述】:

我的 dll 文件有问题。我正在编写一个可以用一些插件扩展的程序。我为这些插件使用了一个接口,我可以在我的程序中阅读和使用它们。每个插件都包含一个可序列化的类,其中包含一些简单的字段。 我可以使用二进制格式化程序序列化这些类并将它们保存到磁盘。但是当我尝试反序列化我保存的文件时,我得到一个异常:“程序集......找不到”。

我必须在哪里注册我的 dll 插件,以便我的程序可以找到程序集?

感谢您的帮助!

【问题讨论】:

    标签: c# serialization plugins dll


    【解决方案1】:

    首先,我强烈推荐使用MEF 作为插件,它是.NET 4.0 的一部分。

    另一方面,DLL 是从 bin 文件夹加载的。如果你把它们放在其他任何地方,它们就找不到了。现在,如果您仍然坚持在您的 bin 中有一个“插件”子文件夹,那么您可以在启动时使用 Assembly.LoadFile 手动加载程序集。

    【讨论】:

    • 嗨。当我的 dll 文件保存到 bin 文件夹时,可以找到该程序集。但是我们必须为插件使用一个特殊的文件夹。我也尝试了“Assembly.LoadFrom()”,但没有帮助。我得到了一个组装对象,它告诉我很多不同的东西,比如其他接口,但是二进制格式化程序仍然不知道组装:(
    • Assembly.LoadFrom 可以工作,但问题是 DLL 可以有依赖项,您可能还必须将依赖项放在插件文件夹中。
    【解决方案2】:

    确保插件 dll 及其所有依赖项位于同一目录(或 GAC)中。

    【讨论】:

      【解决方案3】:

      看这里 http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/e5f0c371-b900-41d8-9a5b-1052739f2521

      在我的情况下,执行程序集和插件程序集在同一个文件夹中,但我抛出异常“程序集...找不到”。

      我写了以下课程

      internal class FromLoadedAssemblyBinder : SerializationBinder
          {
              public override Type BindToType(string assemblyName, string typeName)
              {            
                  Assembly assembly = Assembly.Load(assemblyName);
                  return assembly.GetType(typeName);
              }
          }
      

      并使用

      _binaryFormatter = new BinaryFormatter();
      _binaryFormatter.Binder = new FromLoadedAssemblyBinder();
      

      代码很简单,但在我的项目中运行良好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-15
        • 1970-01-01
        相关资源
        最近更新 更多