从同一个项目编译几个dll并得到不同的结果

时间:2013-05-26 20:44:38

标签: c# reflection dll random

嗨,我在徘徊,我怎么能实现这个过程: 我希望将项目编译几次到几个dll,并通过在其他项目中使用它们来获得不同的结果。 它背后的想法是调试反射应用程序。 这是我的代码:

public class MokingDataSouce : IDataSource
{
    public MokingDataSouce()
    {
        Random random = new Random();
        this.MokingId = random.Next(1, 11);
    }

    public string Name
    {
        get { return "Moking Data Source " + this.MokingId; }
    }

    public int MokingId { get; set; }

    public IDocumentDetails DocumentDetails
    {
        set { }
    }
 }

我几次编译这段代码并重命名dll,希望得到不同的结果。 当我运行一个加载dll并启动MokingDataSource的程序时,我得到所有的MokingId。

P.S我尝试将随机设置为静态成员,但我得到了相同的结果。

我认为它与所有存在于同一运行时CLI中的事实有关。但我找不到克服它的方法。

由于

1 个答案:

答案 0 :(得分:2)

随机是确定性的。它是一种为早期给定值(“种子”)生成数字的算法。

您可以使用种子值初始化Random以获得相同的结果:

var rand = new Random(13);

如果未指定种子值,则使用基于时间的种子值。

你可能会在一个接一个地调用相同的方法,这就是为什么他们使用相同的基于时间的种子值,导致相同的随机值。

如果要使用某个特定编译版本的程序集所特有的值,请查看程序集的moduleversionid,该值是为每个编译唯一生成的:

Assembly.GetExecutingAssembly().ManifestModule.ModuleVersionId

你可以这样做:

var rand = new Random(
    Assembly.GetExecutingAssembly().ManifestModule.ModuleVersionId.GetHashCode()
    );

让你的模块生成相同的随机数,但每次编译都会产生不同的随机数。