17

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

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

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

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

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

4

3 回答 3

11

好的,所以在 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 的更改或我缺少的其他配置设置,不确定;如果有人有更好的主意,请随时编辑/评论。

在这个阶段,如果服务器找到文件,并成功加载程序集和类,它将开始抱怨所有丢失的引用文件,我必须在旁边添加<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

于 2012-11-07T06:01:46.400 回答
5

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

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

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

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

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

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

于 2017-01-10T05:01:15.573 回答
0

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

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

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

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

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

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

于 2019-09-03T22:35:53.240 回答