在编译时创建额外的类型定义

时间:2010-08-20 15:56:55

标签: c# .net visual-studio visual-studio-2010 msbuild

最近我一直在使用MSTest,我注意到testframework在编译时动态生成访问器类。怎么能这样做?

VS2010 C#项目中有一个xml文件。我想在这个xml文件中使用某些数据进行枚举。可以这样做吗?如果是这样,怎么样?

4 个答案:

答案 0 :(得分:1)

方法A)读取xml文件,解析它,从中生成C#代码,将C#代码写入临时文件,编译该代码;删除临时文件。

方法B)读取xml文件,解析它。使用System.Reflection.Emit命名空间中的方法或System.CodeDom命名空间中的方法直接从中生成IL代码。

答案 1 :(得分:1)

MSTest通过几种不同的方式实现了这一目标。简而言之,他们基本上做了以下IIRC

  1. 进入构建系统
  2. 在构建开始时,他们会在项目的隐藏文件中生成他们的访问者
  3. 构建完成后,删除文件
  4. 您可以通过相同的过程实现类似的效果。然而,挂钩到构建系统有点复杂。一种更简单的方法是构建自定义工具/代码生成器和钩子。这允许您在构建时处理文件并吐出相应的代码文件以包含在构建中。

    网上有几个关于如何实现这一目标的例子。这是一对夫妇

答案 2 :(得分:1)

我自己推荐T4模板。非常易于使用,专门设计为允许您在构建期间生成代码。 http://msdn.microsoft.com/en-us/library/bb126445.aspx

答案 3 :(得分:0)

System.CodeDom Namespace是您的唯一选择。

它允许您使用C#代码自动生成一个类并编译它。

您可以在构建项目期间将此代码称为postbuild。

example显示了如何使用此命名空间创建类