Visual Studio网站参考路径

13
在Visual Studio网站项目中(在Visual Studio 2005或更高版本中,而不是Web应用程序项目,其中仍有.csproj文件),引用信息是如何存储的?是否可以在不将已编译的二进制文件存储在源代码控制中的情况下进行源代码控制?
如果你右键单击网站项目并选择属性页,第一个屏幕(引用)列出了所有项目引用。
System.*引用被列为GAC类型,其他DLL文件可以列为BIN或Project。
问题出现在您将某些内容包含为项目引用,然后将其提交到源代码控制时(对于我们来说,是Subversion,忽略.dll和.pdb文件)。
另一个开发人员从存储库获取更新的代码,并且必须手动设置所有这些项目引用,但我甚至无法确定此信息存储在哪里,除非它在.suo中,但这不适合源代码控制。
3个回答

18

如果你通过浏览选项卡按文件名引用.dll文件,应该会创建一个.refresh文件(在BIN中嵌套在dll下面)。我们把它们放在SVN中,这很好用(你可能需要手动编辑它们以使用相对路径)。

从.NET选项卡添加的引用将添加到web.config

项目引用存储在解决方案(.sln)文件中。打开.sln文件,你会看到它们列在其中:

Project("{xxxxxxx-7377-xxxx-xxxx-BC803B73C61A}") = "XXXXXXX.Web", "XXXXXXX.Web", "{xxxxxxxx-BB14-xxxx-B3B6-8BF6D8BC5AFF}"
    ProjectSection(WebsiteProperties) = preProject
        TargetFramework = "3.5"
        ProjectReferences = "{xxxxxxxx-C3AB-xxxx-BBED-2055287036E5}|XXXXXX.Data.dll;
            ...

谢谢你!我一直有一个项目引用的问题,没有注意到当我添加项目引用时sln文件会发生变化。 - Piotr Perak

16

Visual Studio里的“Web Site”项目很奇怪。它们似乎是为了满足传统的web开发人员,其中一个“网站”只是一个目录中的一组文件。同样地,当你在Visual Studio中创建一个“Web Site”项目时,就没有像C#项目有.csproj文件那样的真正的“项目”文件。然而,仍然有一个解决方案文件(.sln)。通常,程序集.dll引用会保存在项目文件中。既然Web Site没有这个文件,那么它们去哪里了呢?

对其他项目的引用

如果您添加了对另一个项目的引用,则解决方案.sln文件中会生成一个条目。它最终看起来像这样:

Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "WebSite1", "..\..\WebSites\WebSite1\", "{F25DB9D6-810D-4C18-ACBB-BFC420D33B20}"
ProjectSection(WebsiteProperties) = preProject
TargetFramework = "3.5"
ProjectReferences = "{11666201-E9E8-4F5A-A7AB-93D90F3AD9DC}|ClassLibrary1.dll;"

文件系统引用

如果您在文件系统中浏览并添加了一个.dll文件,Visual Studio将在\Bin文件夹中创建一个同名的“.refresh”文件。该文件只是一个1行文本文件,指示从哪里加载了该文件。例如,如果我从....\libs添加了“MyAssem.dll”,那么在Web站点\Bin文件夹中,我将会有2个被复制到那里的文件:MyAssem.dll和MyAssem.dll.refresh。.refresh文件将包含文本:“....\libs”。在每次构建中,Visual Studio将检查.refresh文件中的路径,如果那里存在更新的.dll,则会覆盖Bin目录中的.dll。

警告:如果.refresh文件告诉Visual Studio在某处查找文件但该文件不存在,它不会抛出错误。它将继续使用\Bin文件夹中已有的.dll。但它会输出一个警告。

GAC引用

如果您从全局程序集缓存(GAC)中添加组件,则Visual Studio将在Web.config文件中输入它,如下所示:

<compilation debug="false">
 <assemblies>
  <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
再次要注意的是,Visual Studio假定如果程序集在开发计算机上的全局程序集缓存中,它将在运行时处于相同位置!这可能会让你陷入麻烦,尤其是当你在开发机器上安装了Oracle.DataAccess,它会把它放在全局程序集缓存中,但是当你在生产环境中部署时,只需将.dll文件复制到指定位置。它仍然会尝试在全局程序集缓存中找到它,并在运行时失败。
希望这有助于解决关于Web站点以及引用如何工作的一些奇怪问题!

关于这个主题的博客文章非常有帮助。谢谢。 - Remko Jansen
很遗憾,该链接似乎不再有效。 - lgaud
@lgaud:抱歉,我今天早上刚刚停用了这个发布位置的主机。不过我在其他地方备份了它...如果我能找到它,我会更新我的答案,用完整的文本代替链接。 - CodingWithSpike

0

我使用copyprojectDll.ps1 PowerShell脚本。

我的文件夹结构如下:

  • ClassLibraries
    ThirdParty
    Website/Bin
    CopyprojectDll.ps1
    Website.sln

ClassLibraries是我的项目中的代码类,DAL.. 网站项目仅包括Web文件,如aspx、aspx.cs.. ThirdParty是必需的库,AjaxToolkit等。

我编译ClassLibraries.sln 我运行CopyprojectDll.ps1 之后我使用Website.sln。

下面是一个示例powershell文件。

$folders = @(); $folders +="IB.Security" $folders +="ClassLibraries/Core.Classes"

function CopyDllsToWebBin($dll_files) { if ($dll_files -eq $null) { return; } $targetfolder = "./Kod/bin/"

foreach($dll in $dll_files)
{

    copy-item $dll.FullName -destination "$targetfolder" -force #-Verbose
}

}

函数 CopyDllsToThirdParty($dll_files) {

$targetfolder = "./ThirdParty/"

foreach($dll in $dll_files)
{
    copy-item $dll.FullName -destination "$targetfolder" -force #-Verbose
}

}

$dll_output_folder = "/bin/debug";

foreach($folder in $folders) { $dll_files = Get-ChildItem -Path $folder$dll_output_folder -include *.dll -Recurse | sort-object Name CopyDllsToWebBin($dll_files) $dll_files = Get-ChildItem -Path $folder$dll_output_folder -include *.pdb -Recurse | sort-object Name CopyDllsToWebBin($dll_files) $dll_files = Get-ChildItem -Path $folder$dll_output_folder -include *.xml -Recurse | sort-object Name CopyDllsToWebBin($dll_files) "已复制 $folder$dll_output_folder"

}

$dll_files = Get-ChildItem -Path "ThirdParty" -include *.dll -Recurse | sort-object Name CopyDllsToWebBin($dll_files) $dll_files = Get-ChildItem -Path "ThirdParty" -include *.pdb -Recurse | sort-object Name CopyDllsToWebBin($dll_files) $dll_files = Get-ChildItem -Path $folder$dll_output_folder -include *.xml -Recurse | sort-object Name CopyDllsToWebBin($dll_files)

"已复制第三方文件"

日期


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