我的C++;程序集是从C#控制台应用程序看到的,而不是ASP.NET应用程序? 我写了一个C++ DLL。它有一个函数,返回双精度1.0

我的C++;程序集是从C#控制台应用程序看到的,而不是ASP.NET应用程序? 我写了一个C++ DLL。它有一个函数,返回双精度1.0,c#,c++,asp.net,.net,dllimport,C#,C++,Asp.net,.net,Dllimport,我试图在C#控制台应用程序中使用它: namespace MyNameSpace { class Program { [DllImport(@"C:\path\to\my\dll\myDll.dll")] static extern double SendOne(); static void Main(string[] args) { double i = SendOne();

我试图在C#控制台应用程序中使用它:

namespace MyNameSpace
{

    class Program
        {
        [DllImport(@"C:\path\to\my\dll\myDll.dll")]
        static extern double SendOne();

        static void Main(string[] args)
        {
            double i = SendOne();
            Console.WriteLine(i);
        }
    }
}
这很有效

然后,我尝试在ASP.NET应用程序中使用它,该应用程序是用空的MVC应用程序创建的,然后添加一个控制器和一个视图:

控制器/HomeController.cs:

{
    public class HomeController : Controller
    {
        [DllImport(@"C:\path\to\my\dll\myDll.dll")]
        static extern double SendOne();

        // GET: Home
        public ActionResult Index()
        {
            double i = SendOne();
            ViewBag["result"] = i;
            return View();
        }
    }
}
Views/Home/Index.cshtml:

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div> 
        This is some text and the result : @{ ViewBag["result"]}
    </div>
</body>
</html>
堆栈顶部跟踪:HttpException 0x80004005

ASP.NET项目和C#Console应用程序都是同一Visual Studio 2017解决方案中的两个项目,它们互不引用,我分别启动

< >我不知道ASP.NET项目和C控制台应用程序之间存在的差异,可能会导致本地C++DLL加载到C++控制台应用程序中,而在ASP.NET项目中失败。
有没有人知道这个问题,或者对我可以尝试什么有什么建议?谢谢。

当程序尝试加载位不匹配的模块时,会引发BadImageFormatException
。它是64位,但进程尝试加载32位模块,反之亦然。因此,ASP进程似乎是来自控制台应用程序的缓冲位

感谢@DavidHeffernan的回答,我的研究让我想到了这个问题:

它有一个可选择的答案来解决我的问题:不管ASP.NET是被编译为32位还是64位,调试器IIS Express都运行在32位,这与使用64位C++ DLL冲突。


有必要更改调试器的版本,可以在
Visual Studio->Options->Project and Solutions->Web Project->使用64位版本的IIS Express用于网站和项目

我很确定console应用程序是64位的,因为我可以成功地使用我相信只在64位环境中运行的库中的dll函数。这意味着ASP.NET进程是32位的,尽管我用x64编译了这个项目。怎么会这样?我的ASP.NET项目创建的准确回溯是ASP.NET Web应用程序(.NET Framework)>添加控制器和视图>配置管理器>平台>>x64/Debug。勾选创建新的解决方案平台似乎并不重要。如果有帮助的话,我可以记录我的简约项目创建。这就是我给你的答案,不是吗?@DavidHeffernan我找不到“缓冲位”是什么意思,所以我假设它意味着不同的位,但我从一开始就编译ASP.NET版本为64位,如我的回答所述。这里我要说明的是,即使我确实将ASP.NET编译为64位,调试器默认为32位,即使在64位编译模式下也是如此!以及如何修复它。您似乎对问题的答案和问题的解决方案感到困惑。我的问题是“问题出在哪里”,所以说它与位相关不如说它来自调试器的位。你给了我问题的本质,让我找到了解决方案,但我想我会给未来的用户一个更完整的答案。没关系。我认为你不了解这个网站是如何运作的。你的回答涉及问题中没有提到的各种细节。特定于你。我想我回答了被问到的问题,很抱歉你不同意。
[BadImageFormatException: Impossible charge the file or assembly '[Name of the ASP.NET Project]' or one of its dependencies. Attempt to load a program of incorrect format.]
System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +0
System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +36
System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +152
System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean forIntrospection) +77
System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +21
System.Reflection.Assembly.Load(String assemblyString) +28    System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +38