2010-09-24 161 views
1

我正在制作一个模块化程序,它支持插件目录中源文件的动态编译。插件编译器结构?

我想要做的事情,加快加载时间,是编译汇编到一个单独的文件夹。 当我的程序加载,并遇到源文件进行编译时,我希望它检查是否有已编译的程序集,并使用它如果源文件自以来没有更改过。如果源文件已更改,则重新编译并覆盖保存的程序集。

我的问题是,跟踪哪个源文件属于哪个程序集,以及跟踪上次加载后源文件是否发生更改的有效方法是什么?

回答

3

更改跟踪:保留源文件的MD5/CRC哈希记录&上次修改日期,将两者关联以确定文件是否已更改。

至于source-> assembly,我建议convention over configuration

+0

注意:比利ONeal是正确的,你的方法可能有缺陷。你应该使用.NET的普通插件设计,但我想我会直接回答你的问题。 – Aren 2010-09-24 17:17:21

+1

该类型的应用IM发展的将不会与一个普通的.Net插件设计正常工作..我没有问批评这个问题。我问了这个问题,因为我需要为这种情况做一些具体的工作,需要一些见解。 – caesay 2010-09-24 17:26:54

+0

@Tommy:你是被批评的原因是因为你所要求的并没有太大的意义。当某些事情没有多大意义时,会有人回答你,提出针对问题的备选解决方案,以避免您询问的原始问题。但是,如果你[拒绝考虑替代解决方案,而是抨击那些花时间为你写信的人](http://blogs.msdn.com/b/oldnewthing/archive/2010/07/28/10043237 .aspx),你会受到批评。 – 2010-09-24 17:44:26

0

保证这个100%的唯一方法(我能想到的)是保留原始源文件的副本以及编译版本。然后,您可以在原始文件和新文件之间进行文件比较,以查看它们是否已更改,如果是,请执行编译。

+0

您究竟会如何进行这样的比较? – 2010-09-24 17:16:15

+0

或保持哈希!详情请参阅我的回答。 – Aren 2010-09-24 17:16:29

+0

downvote是怎么回事?一个简单的二进制比较可以完美地工作,并且快速地摇摆。 – jvenema 2010-09-24 17:20:21

1

你为什么要这么做?任何将要使用C#为您编写插件的人都将知道如何使用Visual Studio并构建DLL。你最好定义一个DLL接口来代替插件。那么你不必担心任何类型的加载时间。

如果“插件”应该从您的程序本身中更改,那么您应该在程序中更改插件时进行编译,而不是试图查看何时发生更改。

+0

我有一个非常动态的插件系统,不适合做大量的插件编辑,重新加载插件,重新编译插件等,而且更容易编辑源文件并单击按钮而不是打开VS并重新编译。 – caesay 2010-09-24 17:19:11

+0

@Tommy:Err ...你正在编辑VS之外的插件吗?为什么?如果只是点击一个按钮,为什么不仅在点击按钮时重新编译(这是我答案中的第二段)? – 2010-09-24 17:20:17

+0

我的程序是部分自动化的,它会重新加载事件,并且我想尽可能快地完成。因此只在需要时重新编译。 – caesay 2010-09-24 17:25:34

0

我想问你的是,这将是一种有效的方法,来跟踪其源文件属于哪个组件,以及跟踪是否一个源文件已经自去年负载被更改或不

的有效途径

的一种方式可能是:

  1. 使用FileSystemWatcher跟踪文件更改
  2. 保持一个列表(或表),以保持源组件文件关联。