Asp.net调用C#层调用Managed C ++调用Native C ++

我的项目结构如下:

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

似乎Managed C ++代码只有在它位于同一个文件夹中才能找到Native C ++代码 – 显然我不能在temp文件中拥有Native dll。

有没有办法在全局范围内设置Native(不适用于System32)?

谢谢你的评论。

归结为一个选项:

  1. 这是安全问题

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

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

这篇博文文章在ASP.Net中加载C ++程序集可能会帮助你 – 简而言之你需要:

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

我怀疑将你的dll安装到Win SxS也可以,但我不知道这是如何工作的。

你可以设置路径变量吗?

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

我不得不在ApplicationPoolIdentity中翻转一个bool。 在属性中提到的一个说“启用32位”并且做了诀窍:)默认为False我的服务器是64位,我使用32位构建我的本机。