小编har*_*357的帖子

DataContractSerializer - 更改命名空间并反序列化绑定到旧命名空间的文件

我有一个序列化的数据类DataContractSerializer.该类使用[DataContract]没有显式Namespace声明的属性.因此,生成的xml文件中的命名空间是基于类的命名空间生成的.

该课程基本上如下:

namespace XYZ
{
   [DataContract]
   public class Data
   {
      [DataMember(Order = 1)]
      public string Prop1 { get; set; }

      [DataMember(Order = 2)]
      public int Prop2 { get; set; }
   }
}
Run Code Online (Sandbox Code Playgroud)

...以及生成的xml:

<?xml version="1.0" encoding="utf-8"?>
<Data xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/XYZ">
   <Prop1>StringValue</Prop1>
   <Prop2>11</Prop2>
</Data>
Run Code Online (Sandbox Code Playgroud)

现在我想通过将[DataContract]属性更改为更改类的名称空间(实际上将其删除)[DataContract(Namespace = "")].但是,一旦我执行此操作,之前使用原始命名空间序列化的文件不再反序列化.我收到以下异常:

Error in line 1 position XXX. Expecting element 'Data' from namespace ''.. Encountered 'Element' with name 'Data', namespace 'http://schemas.datacontract.org/2004/07/XYZ'.

这很有道理.我更改了命名空间.我很好.但是,似乎必须有一种方法可以告诉它DataContractSerializer继续并反序列化该数据,即使名称空间不匹配.

.net c# datacontractserializer

20
推荐指数
1
解决办法
1万
查看次数

使用ILMerge抛出异常创建签名库

我正在尝试创建包含Castle.Core的FakeItEasy的合并版本.我读到了有关ILMerge的信息,看起来这是我需要的解决方案.下载并构建FakeItEasy后,我将所需的所有文件(FakeItEasy.dll(.NET4),Castle.Core.dll(.NET4),ilmerge.exe,FakeItEasy.snk)复制到同一文件夹中.然后我运行以下命令:

ilmerge 
    /keyfile:FakeItEasy.snk 
    /out:..\FakeItEasy.dll 
    /t:library 
    /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 
    FakeItEasy.dll Castle.Core.dll 
Run Code Online (Sandbox Code Playgroud)

得到以下结果:

An exception occurred during merging:                                                             
An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)                                                                                                
   at System.Compiler.Writer.MscorsnStrongNameSignatureGeneration(String wszFilePath, String wszKeyContainer, Byte[] pbKeyBlob, Int32 cbKeyBlob, IntPtr ppbSignatureBlob, IntPtr pcbSignatureBlob)  
   at System.Compiler.Writer.WritePE(String location, Boolean writeDebugSymbols, Module module, Boolean delaySign, String keyFileName, String keyName)                                              
   at System.Compiler.Writer.WritePE(CompilerParameters compilerParameters, Module module)        
   at ILMerging.ILMerge.Merge()                                                                   
   at ILMerging.ILMerge.Main(String[] args) 
Run Code Online (Sandbox Code Playgroud)

如果我放弃"/keyfile:FakeItEasy.snk",合并的程序集就会很好地创建,但这对我没有帮助,因为我需要一个签名版本.

我也尝试将目标平台指定为:

/targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319
Run Code Online (Sandbox Code Playgroud)

但结果是一样的.

.net ilmerge assembly-signing

5
推荐指数
1
解决办法
1425
查看次数