2010-07-01 42 views
0

我正在为应用程序编写一个插件DLL。该应用程序加载插件通过组件:从父应用程序动态加载的程序集调用XMLSerializer时保存/加载失败吗?

assembly = Assembly.Load(System.IO.File.ReadAllBytes(filename)); 

的问题表现时,我试图序列化/反序列化plublic类。我把它缩小到序列号:

public BindingList<MyClass> MyClasses 
    { get; set; } 

如果我评论一下,没问题。如果我试图用序列:

 public static void SaveSettingsFile() 
     { 
      try 
      { 
       XmlSerializer ser = new XmlSerializer(typeof(GameTimeSettings)); 

       TextWriter writer = new StreamWriter(SettingPath); 
       ser.Serialize(writer, Settings.Instance); 
       writer.Close(); 
      } 
      catch (Exception e) 
      { 
       Logger.ReportException("SaveSettingsFile", e); 
       Logger.ReportException("SaveSettingsFile->InnerException", e.InnerException); 
      } 
     } 

抛出异常的ser.Serialize(作家,Settings.Instance):

System.InvalidOperationException Msg=There is an error in XML document (0,, 0). -> 
InnerException: Object reference not set to an instance of an object. 

我班有一个默认的,空的构造。我曾尝试使用sgen。在我写的一个简单的测试平台应用程序中,序列化工作正常......只有当程序集动态加载时才会出错。

此外,来自这两个线程,

http://forums.gbpvr.com/showthread.php?30384-XMLSerializer-Problems-with-Pluginshttp://forums.gbpvr.com/showthread.php?32197-System.XML-Deserialization

我知道我可以改变从的BindingList类型ArrayList和它的工作;然而,我想保持数据绑定的工作,因为有相当多的设置需要管理。

任何输入,将不胜感激。

+0

你有没有初始化MyClasses?如果不是,那么它的值是'null'。 – 2010-07-01 19:45:32

+0

我会初始化这个类。就像我说的,“在我写的一个简单的测试平台应用程序中,序列化工作正常......” – 2010-07-02 12:54:20

回答

0

约翰桑德斯的评论似乎是正确的,目前为止,你可能没有初始化MyClasses

既然你说SGen可以正常工作,你可能还想检查它是否与编译标志有关,比如可能试着设置它来释放并查看是否改变了事情。

+0

SGen没有工作。 – 2010-07-02 12:55:10

+0

然后你可以发布更多的代码,包括GameTypeSettings的初始化以及MyClass的构造函数吗? – 2010-07-02 15:39:40

0

不好意思把它从坟墓里拉出来,但我今天再次遇到类似的问题,这是第一个谷歌结果,所以我想我会分享。

这似乎是我尝试编写MSBuild自定义任务(基本上是插件)时遇到的问题的一般情况。我在MSDN Forums上发布了它。

以下是评论的最相关的部分,可以替换为的MSBuild有一个插件架构的任何应用程序,并为任何库中使用XmlSerializer的CruiseControl.NET库:

图书馆问题是ThoughtWork CruiseControl.NET的Remoting库,该库使用.NET Remoting和一些客户端激活对象。当您尝试激活对象时,.NET的二进制串行器开始尝试找出将ThoughtWorks.CruiseControl程序集加载到何处以便它可以读取对象(1.4.4SP1中的ThoughtWorks.CruiseControl.Remote.dll) '重新使用)问题是Binary Serializer的GetAssembly Logic没有意识到MSBuild已经执行了一些巫术来从任意位置加载自定义程序集。

因此,它默认尝试查找程序所在的同一个目录,如http://msdn.microsoft.com/en-us/library/yx7xezcf%28v=VS.100%29.aspx,这意味着如果它在GAC中找不到它,它将开始从启动程序的位置开始探测,并且因为MSBuild是从%FrameworkDir%/%FrameworkVersion%文件夹启动的,它不太可能找到它正在查找的程序集。

这就解释了为什么你不会看到这个问题在一个控制台应用程序(大会最有可能坐在旁边的控制台应用程序)

在MSDN论坛帖子所提供的解决方案也适用于此,基本上他们增加了一个额外的事件处理程序试图从已知位置探测,我再次引述有关部分:

对于任何人谁在乎,解决办法是注册为AppDomain.AssemblyResolve事件的处理程序,并到Assembly.LoadFrom()那里。

就我个人而言这让我感到恐慌,但它是我发现的唯一解决方案,多一点Google搜索并未向我展示Microsoft Connect问题,但它很可能不会被修复或是由设计。