有没有办法改变.net mvc bin目录位置?

时间:2012-11-07 04:09:47

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:10)

好的,所以在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>

现在,由于某种原因,其他人建议相对于bin dir指定privatePath(即privatePath="debug"),但在我的情况下,它必须是相对于app root(即如上所述)。也许这是.net4或其他一些配置设置的变化我不知道,不确定;如果有人有更好的想法随时编辑/评论。

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

    <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

答案 1 :(得分:1)

我有同样的问题。为了解决这个问题,我在Post-Build Event中为目标目录创建了一个名为“bin”的目录连接:

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

这样,您可以将输出路径设置为其他位置,甚至完全位于源树之外。

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

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

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

答案 2 :(得分:0)

由于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建议。