无法访问已部署的 c# mvc 项目上的 dll 文件

Posted

技术标签:

【中文标题】无法访问已部署的 c# mvc 项目上的 dll 文件【英文标题】:Unable to access dll file on deployed c# mvc project 【发布时间】:2016-03-17 00:31:33 【问题描述】:

我有一个 c# mvc 应用程序,它使用 c++ dll 进行一些较重的统计计算。当我在本地运行它时一切正常,但在我部署的应用程序上,我得到的只是

异常: 无法加载 DLL 'HandCalculatorDll.dll':找不到指定的模块。 (HRESULT 异常:0x8007007E)

c#模型正在使用

    [DllImport("HandCalculatorDll.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern bool CalculateWinner(int[] req);
    public RoundResult CalculateWinnerDll(List<Hand> hands, List<Card> board)
    
        // set up the request
        // calls the dll
        var success = CalculateWinner(reqArr);
        // interpret the response
        return result;
    

我尝试了几种不同的方法,但对于 已部署 项目似乎没有任何效果。我尝试将 dll 添加到项目中并将其从项目中删除(基于不同的建议)。我尝试了几种相对路径和绝对路径的变体。我用过

    System.Web.Hosting.HostingEnvironment.MapPath("/bin");

要在主机 PC 上找到绝对路径,将 dll 放在该 bin 文件夹中,并将该路径用作 DllImport 属性。

不幸的是,我发现的大多数建议/解决方案仅适用于本地调试。有谁知道如何解决这个问题?

更新 我将整个项目复制到另一台计算机上运行它,并且该计算机抛出了与我发布时相同的“无法加载 DLL”错误。我在第二台计算机上以与家用计算机完全相同的方式运行所有内容,并且我验证了该文件在那里。现在我真的很困惑......

【问题讨论】:

只要确保:您是否在 VS 项目中包含了该 DLL?如果是这样,您是否设置了它的属性,以便在构建时将其复制到输出目录? 是的,两种方法我都试过了。没有骰子... 发布后,您的 dll 是否在 bin 文件夹中?你的 dll 是 32 位的吗?尝试将您的 Web 项目设置为 x86 或在 IIS 中将应用程序池设置为 32 位。 我正在使用 32 位编译项目。当我第一次将项目发布到主机时,它不会运行。在我的主机控制面板上单击“启用 32 位支持”后,该站点就可以访问了。但是没有任何 IIS 特定的控件。 就 bin 文件夹中的 dll 而言,我尝试从多个位置运行它,包括 bin。 【参考方案1】:

尝试右键单击项目中的引用,单击属性并确保将其设置为复制本地。

【讨论】:

我目前将“复制到输出目录”设置为“如果较新则复制”,但我不确定这是否是您所指的。 听起来不错。另一件事是确保您的 dll 所在的文件夹在您的项目中。因为发布时只会将项目中的文件夹复制到服务器 我尝试了几种变体,包括从主项目文件夹运行 dll。似乎没有任何效果。 你是如何部署的?您是使用 Web 部署,还是有其他发布方式? 我的主机不支持网络部署,所以我使用 FTP 部署。

以上是关于无法访问已部署的 c# mvc 项目上的 dll 文件的主要内容,如果未能解决你的问题,请参考以下文章

asp.net mvc3发布(部署)问题。vs2012发布项目缺少文件夹、发布后部署在iis7上网站无法运行

将 C++ DLL 添加到 C# 项目

访问 elmah 时部署在 Azure 上的 MVC 站点返回错误

FMOD C# Wrapper 无法找到 fmod.dll(来自 Monogame 3.8)

C# webservice 引用 dll 无法访问外部 xml 文件

在 C# 项目中使用 MediaInfo.dll