C#如何将序列化的.NET对象编译为.NET程序集

C#如何将序列化的.NET对象编译为.NET程序集,c#,.net,C#,.net,我有一个二进制文件,其中包含序列化的.NET对象(流)。我需要将它编译回.NET程序集(可能使用CodeDomProvider类或其他任何东西) 任何指针都将受到高度赞赏 提前谢谢 不能保证可以将BinaryFormatter序列化对象反序列化(BinaryFormatter是.NET中包含的二进制序列化程序…被认为是相当“邪恶的”)到生成它的源代码。简单的例子: [Serializable] public class MyClass { public DateTime Foo { ge

我有一个二进制文件,其中包含序列化的.NET对象(流)。我需要将它编译回.NET程序集(可能使用CodeDomProvider类或其他任何东西)

任何指针都将受到高度赞赏


提前谢谢

不能保证可以将
BinaryFormatter
序列化对象反序列化(
BinaryFormatter
是.NET中包含的二进制序列化程序…被认为是相当“邪恶的”)到生成它的源代码。简单的例子:

[Serializable]
public class MyClass
{
    public DateTime Foo { get; private set; }

    public MyClass()
    {
        Foo = DateTime.Now;
    }
}
在C#中,除非使用反射,否则无法使用特定的
Foo
值编写
MyClass
对象。你不能写:

var bar = new MyClass { Foo = new DateTime(2018, 1, 1 }
因为
Foo
没有setter

特定情况(如果没有私有字段,如果有setter,则它们都是只设置支持字段值而不进行额外细化的setter)可以转换为C#赋值

可以做的是将二进制文件作为嵌入式资源包含(请参阅),然后读取该文件:

var assembly = Assembly.GetExecutingAssembly();
var resourceName = "ConsoleApp2.Folder1.File1.bin";

MyClass mc;

using (Stream stream = assembly.GetManifestResourceStream(resourceName))
{
    var bf = new BinaryFormatter();
    mc = (MyClass)bf.Deserialize(stream);
}

请注意,这是一个非常糟糕的想法,因为如果底层类型(甚至一些私有字段)发生任何更改,一切都将严重中断。

无法保证可以反序列化
二进制格式化程序
序列化对象(
BinaryFormatter
是包含.NET的二进制序列化程序…它被认为是生成它的源代码的“邪恶”。简单示例:

[Serializable]
public class MyClass
{
    public DateTime Foo { get; private set; }

    public MyClass()
    {
        Foo = DateTime.Now;
    }
}
在C#中,除非使用反射,否则无法使用特定的
Foo
值编写
MyClass
对象。无法编写:

var bar = new MyClass { Foo = new DateTime(2018, 1, 1 }
因为
Foo
没有setter

特定情况(如果没有私有字段,如果有setter,则它们都是只设置支持字段值而不进行额外细化的setter)可以转换为C#赋值

可以做的是将二进制文件作为嵌入式资源包含(请参阅),然后读取该文件:

var assembly = Assembly.GetExecutingAssembly();
var resourceName = "ConsoleApp2.Folder1.File1.bin";

MyClass mc;

using (Stream stream = assembly.GetManifestResourceStream(resourceName))
{
    var bf = new BinaryFormatter();
    mc = (MyClass)bf.Deserialize(stream);
}

请注意,这是一个非常糟糕的想法,因为如果底层类型(甚至一些私有字段)发生任何更改,一切都将严重受损。

我使用了一个名为ClrGuard的工具来完成此操作。 它将在尝试执行时捕获.NET程序集并将其转储到磁盘中。然后我们可以使用ilspy或任何其他.NET反编译器进行加载

ClrGuard将钩住系统上的所有.NET进程。从那里, 它执行本机LoadImage()函数的内嵌钩子 是Assembly.Load()在CLR引擎罩下调用的


参考资料:

我使用了一个名为ClrGuard的工具。 它将在尝试执行时捕获.NET程序集并将其转储到磁盘中。然后我们可以使用ilspy或任何其他.NET反编译器进行加载

ClrGuard将钩住系统上的所有.NET进程。从那里, 它执行本机LoadImage()函数的内嵌钩子 是Assembly.Load()在CLR引擎罩下调用的


参考:

反序列化它的对象生成的二进制格式特定于.NET Framework,无法从其他系统或平台轻松使用。需要更多帮助请首先告诉我,即使您能够制作或找到读取文件并构造.NET类型以匹配的内容,它也不是原始格式.NET类型或类似的类型。该文件根本不包含必要的代码,只包含数据。这听起来像是一个X/Y问题,为什么不告诉我们您的问题似乎是一个很好的解决方案的根本问题,也许我们可以帮您解决这个问题?谢谢大家!我根本不是C#程序员。我需要这样做这是一个大项目的一小部分,我选择使用C#。我正在尝试这样做,以便我可以将此程序集传递给反编译器并获得类结构。任何代码示例都会非常有用。反序列化对象就是它。生成的二进制格式特定于.NET Framework,无法从其他系统或平台轻松使用s、 需要更多帮助首先让我知道,即使您能够制作或找到读取文件并构造要匹配的.NET类型的内容,它也不会是原始的.NET类型或类似的类型。文件根本不包含必要的代码,它只包含数据。这听起来像是个X/Y问题,为什么不呢告诉我们你的问题似乎是一个很好的解决方案的潜在问题,也许我们可以帮你解决?谢谢大家!我根本不是C#程序员。我需要作为一个大项目的一小部分来做这件事,我选择用C#来做。我正在尝试这样做,这样我就可以将这个程序集传递给反编译器并获得类结构。任何Code示例将非常有用。谢谢!我现在有了一些想法。现在让我们直截了当地说。在这段代码中,变量序列化了_obj,其中包含一个序列化流。我有没有办法弄清楚其中嵌入的逻辑?@Dev.K.1。这似乎是相当“非法”的东西,2.链接页面的第一行完美地描述了什么是CSharp MeterMeter Stager,所以你可以直接用谷歌搜索它的源代码。3.即使对你显示的数据进行解码也不会给你任何东西。它使用一个
字节[]的二进制有效载荷来执行
汇编.Load(byte[])
然后您必须保存和反编译。谢谢!我现在有了一些想法。现在让我们直截了当地说。在这段代码中,变量serialized_obj包含一个序列化流。我有没有办法弄清楚其中嵌入的逻辑?@Dev.K.1.这似乎是非常“非法”的东西,2.链接页面的第一行