Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net调用C#层调用托管C++;调用本机C++;_C#_Asp.net_C++_Unmanaged_Managed C++ - Fatal编程技术网

Asp.net调用C#层调用托管C++;调用本机C++;

Asp.net调用C#层调用托管C++;调用本机C++;,c#,asp.net,c++,unmanaged,managed-c++,C#,Asp.net,C++,Unmanaged,Managed C++,我的项目结构如下: NET> C++ > 层调用>强>托管 C++调用 C++ (我试图避免使用互操作,所以这就是管理C++层的原因) 我编写了测试C层的单元测试,它运行良好。 当我尝试运行asp.net页面时,我得到:“无法加载文件或程序集…”错误。 我发现,当我将本机C++dll复制粘贴到“临时ASP.NET文件”(到相应的文件夹)时,该站点可以正常工作 似乎只有当托管C++代码位于同一文件夹中时,它才能找到本机C++代码-显然,我不能在临时文件中包含本机dll 有没有办法在全局位置设

我的项目结构如下:

<> NET> <强> C++ > <强>层调用>强>托管<强> C++调用<强> <强> C++ (我试图避免使用互操作,所以这就是管理C++层的原因) 我编写了测试C层的单元测试,它运行良好。 当我尝试运行asp.net页面时,我得到:
“无法加载文件或程序集…”
错误。 我发现,当我将本机C++dll复制粘贴到“临时ASP.NET文件”(到相应的文件夹)时,该站点可以正常工作

似乎只有当托管C++代码位于同一文件夹中时,它才能找到本机C++代码-显然,我不能在临时文件中包含本机dll

有没有办法在全局位置设置本机(不适用于System32)

谢谢你的评论

它归结为一种选择:
  • 这是安全问题
  • 我用代码自行设置服务器,它在cassini下运行,但当我发布它(在iis7下运行)时,我得到“无法加载文件或程序集…” 我正在运行集成了ApplicationPoolIdentity.net 4的IIS7 谢谢,
    Pini.

    您可以设置path变量吗


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

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

    这篇博客文章可能会帮助您解决问题-简而言之,您需要:

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

    我怀疑安装dll以赢得SxS也会起作用,但我不太清楚这是如何起作用的。

    我不得不在ApplicationPoolIdentity中打开一个bool。属性中的一个字段是“enable32bit”,这就成功了:)默认值为False
    我的服务器是64位的,我用32位构建本机。

    您确定将本机dll复制到System32不起作用吗?只要该文件夹在您的路径中,它就会成功加载。您可能存在64位/32位兼容性问题。如果您的服务器是64位,而本机dll是32位,那么您应该尝试将托管代码构建为X86,并将本机dll复制到Syswow64,而不是SYSTEM32POINT!!我的服务器是64位的。我不认为这是一个问题,因为我能够在服务器(我在那里有vs2010)上构建和运行代码(所有层),但在Cassini下。问题是,当我从本地服务器发布代码时,我得到了错误。感谢Kragen,我已将本机dll目录添加到系统变量路径,重新启动了计算机,但仍然得到了相同的错误。有什么想法吗?也许是因为我引用本地人的方式?哦。。。我不知道这是否重要,但我使用WebDev.WebServer40.exe来运行我的asp.net页面-又名casini。我还没有在iis服务器上试用过。@UshaP哦,刚刚记起来。默认情况下,ASP.Net在受限用户帐户下运行,该帐户几乎肯定无权访问System32目录或系统上的其他路径(但可以访问临时ASP.Net文件夹)。您还应该确保ASP.Net使用的任何帐户都具有读取本机dll所需的NTFS权限。就我所知,我不应该改变。我还怀疑这是权限问题。我不知道如何设置ASP.Net用户。我想卡西尼号是用我的用户名运行的,我是盒子的管理员。有什么想法吗?谢谢,但这并不能帮助我了解KrEAN。你检查了项目依赖吗?它在我运行单元测试时是有效的,如果我把原生C++复制到ASP.NET的临时文件夹中,这三个项目是同一个解决方案吗?单击鼠标右键,然后选择“设置项目依赖项”。本机dll现在应该与托管dll正确地位于bin目录中。是的,它们都在同一个解决方案中。在托管项目->VC++目录中,我将include目录设置为本机路径(硬代码)。