【问题标题】:Is there a way to change .net mvc bin dir location?有没有办法改变 .net mvc bin dir 位置?
【发布时间】:2012-10-27 02:41:58
【问题描述】:

我有一个相当标准和简单的 MVC4 网站。

在根目录中,我们有:bin、内容、脚本、视图。使用项目的 DLL 的默认设置,我们称它为“web.dll”,所有必要的额外内容都放在 bin 目录中。

不知何故,ASP.NET 开发服务器和 IIS7.5 都知道在托管站点时要在 bin 文件夹中查找“web.dll”,如果不存在,它们会抛出错误:“无法加载类型 'CVD。 Web.MvcApplication'”。该错误的标准解决方案是直接构建到 bin 文件夹中,这对我不起作用,因为...

出于调试目的,我希望能够将调试和发布配置分别构建到 bin/Debug 和 bin/Release 中,然后部署两个目录,然后在 IIS、web.config、全局中更改设置。 asax 或其他任何地方来选择是否应由服务器加载和执行 Debug 或 Release 构建。

我无法找到这是否可能,或者 .net webapps 是否有一个愚蠢的硬编码规则,即所有代码都必须存在于 bin 目录中。

【问题讨论】:

    标签: c# asp.net .net asp.net-mvc-4 iis-7.5


    【解决方案1】:

    好的,在 Sen Jacob 提供的几个链接和更多研究的帮助下,我发现只需使用 web.config 就可以完成所有工作。

    首先,我们需要提供新路径并告诉程序集名称,因为我们正在远离默认值:

    <configuration>
        <system.web>
            <compilation debug="true" targetFramework="4.0">
                <assemblies>
                    <add assembly="Something.Web" />
                </assemblies>        
            </compilation>
        </system.web>
        <runtime>
            <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
                <probing privatePath="bin\debug" />
            </assemblyBinding>
        </runtime>
    </configuration>
    

    现在,出于某种原因,人们建议在其他任何地方指定 privatePath 相对于 bin dir(即 privatePath="debug"),但在我的情况下,它必须相对于应用程序根目录(即如上所述)。也许这是 .net4 的更改或我缺少的其他配置设置,不确定;如果有人有更好的想法,请随时编辑/评论。

    在这个阶段,如果服务器找到文件,并成功加载程序集和类,它将开始抱怨所有丢失的引用文件,我必须在&lt;add assembly="Something.Web" /&gt; 旁边添加:

        <assemblies>
            <add assembly="Something.Web" />
            <add assembly="System.Web.Mvc" />
            <add assembly="System.Web.Optimization" />
            <add assembly="System.Web.Helpers" />
            <add assembly="System.Web.WebPages" />
        </assemblies>  
    

    根据我收集到的信息,它会在站点启动时重新编译程序集(不确定)。

    来源: 1 2 3

    【讨论】:

    【解决方案2】:

    我有同样的问题。为了解决这个问题,我在构建后事件中为目标目录创建了一个名为“bin”的目录连接:

    if exist "$(ProjectDir)bin" rmdir "$(ProjectDir)bin"
    mklink /J "$(ProjectDir)bin" "$(TargetDir)"
    

    通过这种方式,您可以将输出路径设置到其他位置,甚至完全在源代码树之外。

    IISExpress 仍将在源代码树中的项目文件夹中运行,但会沿着 bin 结点查找已构建的 DLL。请注意,其他文件将从源树位置使用。

    每次都会删除并重新创建联结,以防您切换构建配置。

    确保 bin 目录在您的旧构建设置中不存在,如果(真实)bin 目录中有文件,则 rmdir 将不起作用。

    【讨论】:

    • 遗憾的是,这是最好的解决方案。这很糟糕。
    • 如何将“其他文件”的位置从源树位置更改为自定义位置?
    【解决方案3】:

    由于probing privatePath 非常有限(它只能指向一个子目录)我认为mikek 的答案是最好的。但是还有一种选择:手动编辑applicationhost.config文件并更改路径。

    applicationhost.config 文件(应位于Visual Studio 在您的解决方案目录中创建的目录.vs\config\ 内)中,找到您的站点并将physicalPath 更改为您想要的任何位置。

    请记住,您必须将路径设置为实际 bin 目录上方的一个目录。而且它变得更糟:您还必须记住将Global.asaxweb.config 复制到该目录。最后你会有

    phsicalPath="Z:\myRamDisk\MySite"
        Z:\myRamDisk\MySite
            bin\
            Global.asax
            Web.config
    

    您甚至可以使用构建来复制所需的文件。

    这很糟糕,但至少它有效。要么是那个,要么是 mikek 的 mklink 建议。

    【讨论】:

      猜你喜欢
      • 2016-06-12
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      • 2012-11-17
      • 2021-01-01
      • 1970-01-01
      • 2013-10-27
      • 2011-12-10
      相关资源
      最近更新 更多