新的 dll 文件上传到 bin 文件夹后的 ASP.NET 运行时错误

Posted

技术标签:

【中文标题】新的 dll 文件上传到 bin 文件夹后的 ASP.NET 运行时错误【英文标题】:ASP.NET runtime error after new dll files uploaded into bin folder 【发布时间】:2021-12-25 05:18:09 【问题描述】:

我尝试将新的 dll 文件添加到 asp.net Web 应用程序 bin 文件夹中,并且每次遇到运行时错误。另外,我认为该请求指向其他 web.config 文件,因为当出现运行时错误时,由于 customErros 模式未关闭,因此无法显示任何错误详细信息的信息。这不是真的,因为我将 customErrors 模式设置为关闭并且已经检查了它在应用程序运行时是否正常工作。 ASP.NET 版本是旧版本 - 2.0,不知道 IIS 是什么版本,它是共享主机。出现错误后,我正在删除最后添加的 dll 文件,以便应用程序再次运行。所以现在我无法添加任何新的 dll 库,因为这个运行时错误。任何想法如何解决它?

【问题讨论】:

如果没有详细的错误信息就很难解决问题。我认为您必须尝试做的第一件事就是找到错误消息。您的问题是在您将其部署到 iis 后才出现的吗? 【参考方案1】:

一般来说,您永远不会真的想将 bin 文件放入 bin 文件夹中。

如果你做了一个干净的项目(通常可能会这样做),那么 bin 文件就会被清空。如果您需要包含一些附加程序集,请在项目中正确引用它们。然后在构建时,它们将被正确洗牌并正确包含在 bin 文件夹中。

您真的不想将一些 bin 文件放入 bin 文件夹,然后尝试引用这些程序集,因为如上所述,bin 文件夹可以在解决方案的重建过程中被清除。因此,将这些 bin 文件添加为对项目的引用。

另一个问题是在网络发布期间,您可以选择将所有 .dll 文件“合并”到一个程序集中,因此 bin 文件夹再次被视为项目构建的结果输出 - 而不是某个 repostitoty 位置您开始在其中放入 .dll 等。

我似乎有些人试图将 bin 文件放入 bin 文件夹,但你只会遇到问题,因为如前所述,尝试这样做时会出现多个问题。

我的意思是,想想 nuGet 添加?它在项目文件夹中创建一个名为“packages”的文件夹。而且您不会认为此文件夹不会出现在项目文件夹中 - 但您不会开车,因为如果您检查引用,您会看到许多 .dll 引用的 Hodge Podge 将指向该包文件夹。在构建时,.net 和编译过程会确定需要哪些 .dll,然后将它们打乱并放入 bin 文件中。

那么,如果您需要一些 .dll?在项目级别创建一个文件夹,将它们放入,然后将引用添加到您的项目中——它们将被正确链接、解析并在构建时成为您项目的一部分。然后,该构建过程将通过正确引用 bin 文件夹进行复制。

请勿尝试将其设为手动过程。您只需要在项目中添加 + 引用正确的程序集 - 并且 bin 文件夹不是引用此类文件的位置。

我想唯一的例外是如果您的代码在运行时通过说 Assembly.LoadFrom() 加载程序集 (.dll)。

即便如此,您仍然可以在项目中创建一个文件夹(并添加这些文件),并将构建时的副本包含到 bin 文件中。

编辑:

例如,我正在使用 ajax 工具包。所以,在项目探索中我看到了这个:

如果我右键单击 ajaxtool 工具包,显示属性表,我们会看到:

看看那个长长的可怕路径名——绝对 100% 在这个网站之外。但是,通过本地复制,当然在构建过程中,那个 .dll 会被复制到 bin 文件夹中。

上面说的同样适用于 newtonsoft (json),同样,它在网站之外。

因此,那些引用的程序集应该被复制到输出(bin)文件夹中。

但是,您可能使用的是网站而不是网站应用程序。 (你只是打开网站(因此:一个网站)。

或者, 您是否打开一个项目 (sln) 文件,从而拥有一个 asp.net 网站应用程序。 (关键区别在于网站与网站应用程序)。

但是,在这两种情况下,.dll 都应该并且确实在构建期间被复制到输出文件中。但是,如果您只使用一个网站,那么您就没有同样意义上的构建过程。在这种情况下,您可以考虑使用 app_code。

我的意思是,我可以假设将 .dll 放入 bin 中,然后引用它们,但是当你第一次做一个干净的项目时,这会分崩离析——因为 bin 文件夹应该被认为是“临时的”在开发过程中。

【讨论】:

这是一个很好的建议,但可能我的知识很差,无法以新的方式管理它。具体来说,我是这样做的:我使用 nuget manager 并在我的 PC 上的项目中本地安装库。所以nuget manager自动将dll放入bin。当我看到新文件时,我只是将它们复制到服务器上的 bin 文件夹中。 当我提出您的建议时,我会创建另一个名为 BinPackages 的文件夹并将新库复制到其中。接下来,我通过网站->添加引用->浏览添加了对项目的引用。但是路径是本地的,所以它不会在服务器中工作。那么如何“移动”对服务器的引用呢?或者也许有什么方法可以在服务器端引用? 构建时,.dll 应该复制到 bin 文件夹。所有引用的 .dll,无论它们存在于何处,都应因此被复制到 bin 文件夹中。但是,听起来您有一个网站,而不是一个网站应用程序。请参阅我上面的编辑 - 我显示了一个屏幕截图。您可能没有“复制本地”设置? 非常感谢您的耐心等待。你是对的,它是网站,而不是网络应用程序,我在树参考中看不到,我无法检查屏幕上的属性,也没有 copy local 设置,.我也在使用 AjaxControlToolkit 和其他库。我尝试通过添加引用和构建过程来添加 ClosedXML 库,并且在将 dll 从 Bin 文件夹复制到服务器之后,但只有本地我能够在代码中使用它。通常我不使用构建过程,只是在开发PC上更改代码并将文件上传到服务器。 正如你所建议的,我也可以使用 App_Code(那里的类很少)但是当我查看 github 上的源代码时,我不确定应该使用哪些文件(尤其是当我使用VB,只有CS,但没关系)。但是 bin 中的 dll 应该可以正常工作。

以上是关于新的 dll 文件上传到 bin 文件夹后的 ASP.NET 运行时错误的主要内容,如果未能解决你的问题,请参考以下文章

asp.net网站上传后出现能加载文件或程序集"Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll”x

将 DLL 动态加载到单独的应用程序域中,然后卸载

怎么将dll的文件复制替换到C:\windows\system32 win7

如何在C#做的网页里添加bin文件和DLL?

我用的vs2008 没有fileupload组件

将 DLL 添加到 SharePoint bin 文件夹