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

Mik*_*sov 15 .net c# asp.net iis-7.5 asp.net-mvc-4

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

在root目录中,我们有:bin,content,scripts,views.使用项目的DLL的默认设置,我们称之为"web.dll",所有必要的额外内容都在bin目录中.

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

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

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

Mik*_*sov 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>
Run Code Online (Sandbox Code Playgroud)

现在,出于某种原因,其他人建议指定privatePath相对于bin dir(即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>  
Run Code Online (Sandbox Code Playgroud)

从我收集的内容中,它重新编译了站点启动时的程序集(不确定).

资料来源: 1 2 3


小智 5

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

if exist "$(ProjectDir)bin" rmdir "$(ProjectDir)bin"
mklink /J "$(ProjectDir)bin" "$(TargetDir)"
Run Code Online (Sandbox Code Playgroud)

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

IISExpress 仍将在源代码树中的项目文件夹中运行,但会遵循 bin 连接来查找构建的 DLL。请注意,将从源树位置使用其他文件。

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

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

  • 可悲的是,这是最好的解决方案。这很糟糕。 (3认同)