【问题标题】:Compiling a dll using CSharpCodeProvider and making sure it is identical to the one compile with Visual Studio使用 CSharpCodeProvider 编译 dll 并确保它与使用 Visual Studio 编译的相同
【发布时间】:2014-09-30 19:01:45
【问题描述】:

我正在处理的一个项目需要一个 .dll,它需要在运行时进行一些更改。现在我使用 Visual Studio 编译它并且工作正常,但现在我想以编程方式进行。

我目前正在使用 CSharpCodeProvider,它似乎工作得很好。但是当我检查由 Visual Studio 编译的文件和使用我的程序使用 Kdiff 编译的文件时,它们有一些细微的差别。我希望它们是相同的。

通过这样做,我已经确保使用与 Visual Studio 相同的框架,即 .NET 3.5

providerOptions.Add("CompilerVersion", "v3.5");

1.为了确保编译过程与我目前在 Visual Studio 中使用的相同,我还需要添加其他参数吗?

2.当我使用反射器反编译我以编程方式编译的 dll 时,似乎引用不包含在项目中。我通过这样做将它们添加到 dll 中。我做错了吗?

using System;
using System.Drawing;
[...]
compilerParameters.ReferencedAssemblies.Add("System.dll");
compilerParameters.ReferencedAssemblies.Add("System.Drawing.dll");

ps。我知道当我在运行时进行更改时它们不会完全相同,但现在我只是想获得完全相同的 dll。

【问题讨论】:

  • 您是否考虑过使用 mono.cecil 或 postsharp?

标签: c# dll


【解决方案1】:

您永远无法获得精确的二进制匹配,像程序集的 MVID 和记录在 PE32 标头中的时间戳等晦涩难懂的东西总是不同的。

最实用的方法是编写一个小程序,使用 Process 类运行带有/out 选项的 ildasm.exe 来反编译程序集。现在是简单的文本比较,用 StreamReader 实现很简单。有了额外的巨大优势,您现在还可以确切地知道 什么 不同。

【讨论】:

    猜你喜欢
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多