我有一个相当标准和简单的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目录中。
答案 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 :(得分: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.asax
和web.config
复制到该目录。最后,您将拥有
phsicalPath="Z:\myRamDisk\MySite"
Z:\myRamDisk\MySite
bin\
Global.asax
Web.config
您甚至可以使用内部版本来复制所需的文件。
很烂,但至少可以正常工作。就是那个,还是mikek的mklink
建议。