C# 简单C++。用pinvoke调用dll;为我工作,但没有其他人 我不知道C++的任何内容,但我已经找到足够的方法来获得一个特定用途的.DLL,因为有一些代码我不能让C来做。

C# 简单C++。用pinvoke调用dll;为我工作,但没有其他人 我不知道C++的任何内容,但我已经找到足够的方法来获得一个特定用途的.DLL,因为有一些代码我不能让C来做。,c#,c++,pinvoke,C#,C++,Pinvoke,因此,我使用Visual Studio 2013->Win32 Project->Dynamic Link Library作为类型创建了这个DLL,并选择了“Empty Project”等 现在我转到我的C#程序,我有pinvoke部分按名称调用这个dll(Legacy.dll)。我从C++编译DLL,并将其从/释放文件夹复制粘贴到我的C应用程序的/bin/释放和/ bin /调试文件夹,并运行C/X应用程序。 它很好用。我没有问题 然而,当我将文件-dll和.exe发送给其他人时,它告诉他们找

因此,我使用Visual Studio 2013->Win32 Project->Dynamic Link Library作为类型创建了这个DLL,并选择了“Empty Project”等

现在我转到我的C#程序,我有pinvoke部分按名称调用这个dll(
Legacy.dll
)。我从C++编译DLL,并将其从/释放文件夹复制粘贴到我的C应用程序的/bin/释放和/ bin /调试文件夹,并运行C/X应用程序。 它很好用。我没有问题

然而,当我将文件-dll和.exe发送给其他人时,它告诉他们找不到完全相同的dll。但它显然在那里,它显然在为我工作

那么问题出在哪里呢?我正在将C#程序和DLL编译为32位

更新
问题是我的用户有C++库,但是它被偷偷地更新了,需要2013个,这在我的第一次搜索中没有出现。我必须进行明确的特定搜索才能找到它。

您的操作系统是什么?您运行的是32位还是64位版本的Windows?对于要加载32位本机DLL的.NET程序,您必须确保将.NET项目的体系结构也设置为“32位”。默认情况下,它位于“任意CPU”上,它将根据运行程序的计算机选择体系结构。如果您在64位系统上运行该程序,它会期望本机DLL也是64位的(这会导致问题)。

我知道这听起来很愚蠢,但您是否正在检查C程序中的DLL?(有时用户可能是…“有趣的”)

例如:

void Initialize()
{
   var path = Path.Combine(Environment.CurrentDirectory, "Legacy.dll");

   if(!File.Exists(path))
   {
     // Alert the user that the accompanying DLL is missing...
   }
}

除此之外,我会检查架构。您是在32位操作系统上,而他们是在64位操作系统上吗?

您是如何引用dll的?c应用程序在哪个相对路径中查找的?我不确定。我只是引用文件名<代码>[DllImport(“Legacy.dll”,CallingConvention=CallingConvention.Cdecl)]-它没有给我带来任何麻烦,只是给其他人带来麻烦。我想这意味着它希望.dll与
.exe
尝试使用静态链接在同一文件夹中?我在Windows XP、Vista、7、所有32位上都尝试过它。还有7 64位、8 64位和8.1 64位。我已经显式地将其设置为x86。好吧,那就奇怪了。路径或文件名中有特殊字符吗?如果使用OneClick分发程序会发生什么?@Mario Bitness错误不会导致找不到错误。你没有得到一个有效的Win32 imageHm对,很久没有使用过它了。不幸的是,也不能是依赖项错误。真的很有趣,不知道那会是什么(