【问题标题】:Asp.net calling C# layer calling Managed C++ calling Native C++Asp.net 调用 C# 层调用 Managed C++ 调用 Native C++
【发布时间】:2011-08-13 22:49:02
【问题描述】:

我的项目结构如下:

ASP.NET 调用 C# 层调用 Managed C++ 调用 Native C++ (我试图避免使用互操作,所以这就是托管 c++ 层的原因) 我编写了测试 C# 层的单元测试,它工作正常。 当我尝试运行 asp.net 页面时,我得到:"Could not load file or assembly..." 错误。 我发现当我将 Native C++ dll 复制粘贴到“Temporary ASP.NET Files”(到相应的文件夹)时,该站点可以正常工作。

似乎 Managed C++ 代码只有在同一文件夹中才能找到 Native C++ 代码 - 显然我不能将我的 Native dll 放在临时文件。

有没有办法将 Native 设置在全局位置(不适用于 System32)?

感谢你们的cmets。

归结为一种选择:

  1. 这是安全问题

我用代码自行设置了服务器,它在 cassini 下运行,但是当我发布它(在 iis7 下运行)时,我得到“无法加载文件或程序集......” 我正在运行带有 ApplicationPoolIdentity 的 IIS7,集成了 .net 4 非常感谢, 皮尼。

【问题讨论】:

  • 您确定将本机 dll 复制到 System32 不起作用吗?只要该文件夹在您的路径中,它就应该成功加载。
  • 您可能遇到了 64 位/32 位兼容性问题。如果您的服务器是 64 位而您的本机 dll 是 32 位,您应该尝试将托管代码构建为 X86 并将您的本机 dll 复制到 Syswow64 而不是 System32
  • 有趣点!!我的服务器是 64 位的。我认为这不是问题,因为我能够在服务器上(我在那里有 vs2010)但在 Cassini 下构建和运行代码(所有层)。问题是当我在本地从服务器发布代码时,我得到了错误。

标签: c# asp.net c++ unmanaged managed-c++


【解决方案1】:

从技术上讲,以这种方式使用托管 C++ 是本机/托管代码之间的一种互操作形式,常用的替代方案是 COM 和 P/Invoke。这纯粹是一个术语问题,但是使用 P/Invoke 会遇到同样的问题。

这篇博客文章Loading C++ Assemblies in ASP.Net 可能会对您有所帮助 - 简而言之,您需要:

  • 在托管 C++ 程序集尝试加载您的本机 C++ dll 之前设置 %PATH% 环境变量。
  • 使用 DllImport 属性设置 dll 路径(不适用于您的情况,因为您没有使用 P/Invoke)
  • 在托管 C++ 程序集尝试加载您的本机 C++ dll 之前,您自己手动加载 C++ dll(例如使用 LoadLibrary)。

我怀疑将你的 dll 安装到 Win SxS 也可以,但我不太了解它是如何工作的。

【讨论】:

  • 感谢 Kragen,我已将 Native dll 目录添加到系统变量路径中,重新启动计算机后仍然出现相同的错误。任何想法?也许是因为我引用 Native 的方式?
  • 哦……我不知道这是否重要,但我使用 WebDev.WebServer40.exe 来运行我的 asp.net 页面 - 也就是 casini。我还没有在iis服务器上尝试过。
  • @UshaP 哦,想起来了。默认情况下,ASP.Net 在受限用户帐户下运行,该帐户几乎可以肯定无法访问 System32 目录或系统上的其他路径(但可以访问 Temporary ASP.Net 文件夹)。您还应该确保 ASP.Net 使用的任何帐户都具有读取本机 dll 所需的 NTFS 权限。据我所知,IIS 与 Casini 应该没什么区别。
  • 我也怀疑是权限问题。我不确定如何设置 ASP.Net 用户。我认为 cassini 以我的用户名运行,并且我是该框的管理员。有什么想法吗?
【解决方案2】:

你可以设置你的路径变量吗?

您可以通过转到“我的电脑”/“计算机(Windows-PauseBreak)的属性,然后单击高级设置。单击高级。环境变量。根据需要修改系统变量下的“路径”。

【讨论】:

  • 谢谢,但我对 Kragen 的评论并没有帮助。
  • 你检查过你的项目依赖了吗?
  • 当我运行我的单元测试并且如果我将本机 c++ 复制到 asp.net 临时文件夹时它确实有效
  • 这三个项目是否在同一个解决方案中?右键单击,然后选择设置项目依赖项。本机 dll 现在应该正确地位于托管 dll 的 bin 目录中。
  • 是的,它们都在同一个解决方案中。在托管项目 -> VC++ 目录中,我将包含目录设置为本机路径(硬代码)。
【解决方案3】:

我不得不在 ApplicationPoolIdentity 中翻转一个布尔值。属性中的一个字段说“启用 32 位”,这就是诀窍 :) 默认值为 False 我的服务器是 64 位的,我用 32 位构建我的本机。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多