Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.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# 当从父应用程序动态加载的程序集调用时,XMLSerializer未能保存/加载?_C#_Xmlserializer - Fatal编程技术网

C# 当从父应用程序动态加载的程序集调用时,XMLSerializer未能保存/加载?

C# 当从父应用程序动态加载的程序集调用时,XMLSerializer未能保存/加载?,c#,xmlserializer,C#,Xmlserializer,我正在为一个应用程序编写一个插件dll。应用程序通过以下方式加载插件程序集: assembly = Assembly.Load(System.IO.File.ReadAllBytes(filename)); 当我尝试序列化/反序列化一个plublic类时,问题就会显现出来。我把范围缩小到以下系列: public BindingList<MyClass> MyClasses { get; set; } Serializewriter、Settings上引发异常。实例: S

我正在为一个应用程序编写一个插件dll。应用程序通过以下方式加载插件程序集:

assembly = Assembly.Load(System.IO.File.ReadAllBytes(filename)); 
当我尝试序列化/反序列化一个plublic类时,问题就会显现出来。我把范围缩小到以下系列:

public BindingList<MyClass> MyClasses
    { get; set; }
Serializewriter、Settings上引发异常。实例:

System.InvalidOperationException Msg=There is an error in XML document (0,, 0). ->
InnerException: Object reference not set to an instance of an object.
我的类有一个默认的空构造函数。我试过使用sgen。在我编写的一个简单的测试平台应用程序中,序列化工作得很好。。。只有当程序集被动态加载时,它才会出现故障

而且从这两条线,

,

我知道我可以将类型从BindingList更改为ArrayList并使其正常工作;然而,我希望保持数据绑定工作,因为有相当多的设置需要管理


如果您有任何意见,我们将不胜感激。

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


既然你说它与SGen配合得很好,你可能还想检查它是否与编译标志有关,比如可能尝试将它设置为release,看看这是否会改变情况。

很抱歉,我今天又遇到了类似的问题,这是谷歌的第一个结果,所以我想与大家分享一下

这似乎是我不久前尝试将MSBuild自定义任务编写为插件时遇到的一个问题的一般情况。我把这件事贴在了网上

以下是注释中最相关的部分,只需将MSBuild替换为任何具有插件体系结构的应用程序,将CruiseControl.NET库替换为任何使用XmlSerializer的库:

所讨论的库是ThoughtWork的CruiseControl.NET的远程处理库,该库使用.NET远程处理和一些客户端激活的对象。当您尝试激活该对象时,.NET的二进制序列化程序开始工作,试图找出从何处加载ThoughtWorks.CruiseControl程序集,以便它可以读取1.4.4SP1中的对象ThoughtWorks.CruiseControl.Remote.dll,我们正在使用该对象。问题是二进制序列化程序的GetAssembly逻辑没有意识到MSBuild执行了一些巫术来加载自定义来自任意位置的程序集

因此,它默认尝试在程序所在的同一目录中查找,这意味着如果在GAC中找不到它,它将从程序启动的位置开始探测,而且,由于MSBuild是从%FrameworkDir%/%FrameworkVersion%文件夹启动的,因此不太可能找到它要查找的程序集

这就解释了为什么你不会在控制台应用程序中看到这个问题——程序集很可能就在控制台应用程序的旁边

MSDN论坛帖子中提供的解决方案也适用于此,基本上他们添加了一个额外的事件处理程序,以尝试从已知位置进行探测,我再次引用了相关部分:

对于任何关心此问题的人,解决方法是为AppDomain.AssemblyResolve事件注册一个处理程序,然后从那里注册到Assembly.LoadResolve


就我个人而言,这让我感到害怕,但这是我发现的唯一有效的解决方案,更多的谷歌搜索并没有向我显示Microsoft Connect的问题,但它很可能不会被修复,或者是设计出来的。

你有没有初始化过MyClass?如果不是,则其值为null。我会初始化该类。就像我说的,在我编写的一个简单的测试平台应用程序中,序列化工作得很好……那么你能发布更多的代码吗,包括GameTypeSettings的初始化以及MyClass的构造函数?
System.InvalidOperationException Msg=There is an error in XML document (0,, 0). ->
InnerException: Object reference not set to an instance of an object.