如何使用Nant构建一个类库

4

我如何使用Nant(0.86)将.NET 3.5类库编译为DLL文件?

目前为止,这是我所拥有的:

我如何在GAC中引用系统的DLL?这行代码似乎不起作用。

<include name="System.ComponentModel.DataAnnotations.dll"/>

这是我的脚本:
<?xml version="1.0"?>
<project name="MyCorp.Data" default="all">

  <property name="debug" value="true" />

  <target name="all"/>

  <target name="clean" description="remove all build products">
    <delete dir="build"  if="${directory::exists('build')}" />
  </target>

  <target name="init">
    <mkdir dir="build" />
  </target>

    <target name="compile" 
            depends="init"
            description="compiles the application">
        <csc target="library" output="build\${project::get-name()}.dll" debug="${debug}">
            <sources>
                <include name="src\MyCorp.Data\**\*.cs" />                             
            </sources>
            <references>                        
          <include name="tools\subsonic\subsonic.dll"/>
          <include name="lib\log4net\log4net.dll"/>
          <include name="System.ComponentModel.DataAnnotations.dll"/>
            </references>                        
        </csc>
    </target>

</project>

我通过使用JP Boodhoo的文章实现了这一步骤。

3个回答

4

我不知道在NAnt中可以使用GAC引用DLL,你需要将物理DLL放在某个地方(例如项目的lib文件夹中),并像普通的DLL一样引用它:

<include name="lib\System\System.ComponentModel.DataAnnotations.dll"/>

获取GAC DLL的一种方法是从命令提示符中cd到C:\Windows\assembly\GAC_MSIL,然后使用dir命令列出其内容。这是一个隐藏的GAC目录。如果找到所需的程序集,请进入该目录,您将会发现不同.NET版本的文件夹(例如3.5.0.0)。进入正确的文件夹,您应该能够找到DLL本身,然后可以拷贝出来。在我的电脑上,它位于:

C:\Windows\assembly\GAC_MSIL\System.ComponentModel.DataAnnotations\3.5.0.0__31bf3856ad364e35

我认为如果您使用MSBuild而不是csc,则不需要对GACed DLL进行硬引用,它会自动查找。


真的吗?Nant无法访问GAC? - Dan
这可能是一件好事,它使您的代码更具可移植性 - 您无法保证谁在他们的GAC中拥有什么。同事可能没有System.ComponentModel.DataAnnotations,在这种情况下他/她就会遇到麻烦。 - James Allen
1
不要认为这个参数适用于系统dll。 - Dan

2

@Dan

请问您使用的是哪个版本的.Net?我是一个新的nAnt用户,很快就发现,如果要构建针对3.5SP1框架的Dll和可执行文件,需要使用0.86 beta版本,而不是您当前使用的0.85版本。您也可以使用0.85,但需要调用MSBuild任务并链接到解决方案/项目文件。我在网上搜索了一整天才弄明白这一点。


谢谢提供有用的信息。是的,我正在构建一个3.5应用程序,所以我需要更新版本的Nant。 - Dan

0

我从未遇到过NAnt引用GAC中的DLL出现任何问题。你的代码应该是可以工作的,我认为可能是你的构建文件还有其他问题,但这只是我的猜测。

以下是我其中一个构建文件中的代码行,它们完全正常:

<references>
    <include name="System.dll" />
    <include name="System.Data.dll" />
    <include name="System.XML.dll" />
</references>

我通常犯的一个常见错误是假设NAnt正在使用项目文件中定义的项目导入,而我的代码中没有正确地引用它们。

你能具体告诉我们在编译过程中出现了什么错误吗?或者如果你在运行时遇到了错误,那么它是什么?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接