【问题标题】:Visual Studio Website Reference PathsVisual Studio 网站参考路径
【发布时间】:2008-11-10 22:44:41
【问题描述】:

在 Visual Studio 网站项目中(在 Visual Studio 2005 或更高版本中,不是仍然存在 .csproj 文件的 Web 应用程序项目)参考信息是如何存储的,是否可以对其进行源代码控制而不将编译的二进制文件存储在源代码中控制?

如果您右键单击网站项目并选择“属性页”,第一个屏幕(参考)会列出所有项目参考。

System.* 引用被列为 GAC 类型,其他 DLL 文件可以列为 BIN 或 Project。

当您包含某些内容作为项目引用,然后将其提交到源代码管理(对我们而言,Subversion,忽略 .dll 和 .pdb 文件)时,就会出现问题。

另一个开发人员从存储库获取更新的代码,并且必须手动设置所有这些项目引用,但我什至无法确定这些信息的存储位置,除非它在那个不适合源代码控制的 .suo 中.

【问题讨论】:

    标签: visual-studio version-control


    【解决方案1】:

    如果您通过浏览选项卡按文件名引用 .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 文件正在更改。
    【解决方案2】:

    Visual Studio 中的“网站”项目是一个奇怪的东西。它们似乎是为了迎合传统的 Web 开发人员,其中“站点”只是目录中的一组文件。同样,当您在 Visual Studio 中创建“网站”项目时,没有真正的“项目”文件,就像 C# 项目有一个 .csproj 文件一样。但是,仍然有一个解决方案文件 (.sln)。通常,程序集 .dll 引用保存在项目文件中。既然一个网站都没有,他们去哪里了?

    对其他项目的引用

    如果您添加对另一个项目的引用,则会在解决方案 .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”,然后在网站 \Bin 文件夹中,我最终会复制 2 个文件:MyAssem.dll 和 MyAssem.dll.refresh。 .refresh 文件将包含文本:“....\libs”。在每次构建时,Visual Studio 都会检查 .refresh 文件中的路径,如果那里存在较新的 .dll,它将覆盖 Bin 目录中的那个。

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

    GAC 参考资料

    如果您从全局程序集缓存中添加程序集,Visual Studio 会将其输入到 Web.config 文件中,如下所示:

    <compilation debug="false">
     <assemblies>
      <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    

    您需要再次注意的是,Visual Studio 假定如果程序集位于您的开发计算机上的 GAC 中,那么它在运行时将位于同一位置!如果您可能在您的开发机器上安装了Oracle.DataAccess,这可能会给您带来麻烦,这会将它放在 GAC 中,但是当您部署时,您只需将 .dll 复制到生产机器上的适当位置。它仍然会尝试在 GAC 中找到它,并且可能会在运行时失败。

    我希望这有助于清除网站上的怪异之处以及引用的工作原理!

    【讨论】:

    • 关于该主题的非常有用的博客文章。谢谢。
    • 不幸的是,链接似乎不再有效。
    • @lgaud :哎呀抱歉,我刚刚停用了今天早上发布的托管服务。不过,我在某处复制了它......如果我能找到它,我会用全文而不是链接更新我的答案。
    【解决方案3】:

    我使用 copyprojectDll.ps1 powershell。

    我的文件夹结构如下

    • 类库
      第三方
      网站/Bin
      复制projectDll.ps1
      网站.sln

    ClassLibraries 是我的项目 DAL 的代码类。 网站项目仅包含 web 文件、aspx、aspx.cs .. 第三方是必需的库,AjaxToolkit 等。

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

    示例 powershell 文件如下。

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

    函数 CopyDllsToWebBin($dll_files) { if ($dll_files -eq $null) { 返回; } $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($folders 中的$folder) { $dll_files = Get-ChildItem -Path $folder$dll_output_folder -include *.dll -Recurse |排序对象名称 CopyDllsToWebBin($dll_files) $dll_files = Get-ChildItem -Path $folder$dll_output_folder -include *.pdb -Recurse |排序对象名称 CopyDllsToWebBin($dll_files) $dll_files = Get-ChildItem -Path $folder$dll_output_folder -include *.xml -Recurse |排序对象名称 CopyDllsToWebBin($dll_files) "复制的 $folder$dll_output_folder"

    }

    $dll_files = Get-ChildItem -Path "ThirdParty" -include *.dll -Recurse |排序对象名称 CopyDllsToWebBin($dll_files) $dll_files = Get-ChildItem -Path "ThirdParty" -include *.pdb -Recurse |排序对象名称 CopyDllsToWebBin($dll_files) $dll_files = Get-ChildItem -Path $folder$dll_output_folder -include *.xml -Recurse |排序对象名称 CopyDllsToWebBin($dll_files)

    “复制的第三方”

    日期

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-04
      • 2020-06-30
      相关资源
      最近更新 更多