C# 即使文件位于Bin文件夹中,dlliport也不工作

C# 即使文件位于Bin文件夹中,dlliport也不工作,c#,.net,com,dllimport,C#,.net,Com,Dllimport,我正在使用第三方应用程序,该应用程序在其代码中使用DLLImport。他们正在使用的COM DLl,他们分别给了我 我确实将该文件放在第三方源代码的Bin/Debug文件夹中,并重新编译了代码 完成此操作后,我发现应用程序上出现无法加载模块错误。你知道为什么会这样吗 出现以下错误: Unable to load DLL 'QMSL_MSVC10D.dll': The specified module could not be found. (Exception from HRESULT: 0x8

我正在使用第三方应用程序,该应用程序在其代码中使用DLLImport。他们正在使用的COM DLl,他们分别给了我

我确实将该文件放在第三方源代码的Bin/Debug文件夹中,并重新编译了代码

完成此操作后,我发现应用程序上出现无法加载模块错误。你知道为什么会这样吗

出现以下错误:

Unable to load DLL 'QMSL_MSVC10D.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)"}
我确实在其中运行了dependency walker,我看到了以下错误:

Error: At least one required implicit or forwarded dependency was not found.
Error: At least one module has an unresolved import due to a missing export function in an implicitly dependent module.
Error: Modules with different CPU types were found.
Warning: At least one delay-load dependency module was not found.
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.

我的问题是,他们怎么能编译有这么多错误的DLL?我在Dependency walker中看到的错误和我们在Dependency walker中看到的错误之间有什么关联?如果这是COM DLL,您需要用“regsvr32 name.DLL”注册它。在命令提示符下键入它,然后按“Enter”。将“name.dll”替换为您拥有的dll


如果DLL必须是GAC而不是bin文件夹的一部分,则也可能发生此错误。

如果这是COM DLL,则需要将其注册为“regsvr32 name.DLL”。在命令提示符下键入它,然后按“Enter”。将“name.dll”替换为您拥有的dll

如果DLL必须是GAC而不是bin文件夹的一部分,也可能发生此错误。

除了“未找到DLL”,该错误消息还可能意味着未找到DLL的一个依赖项,DLL或其一个依赖项的体系结构与主机应用程序不同,或者初始化功能
DllMain
返回故障代码

使用Process Monitor监视文件活动,并检查打开DLL文件(可能是DllImport中列出的文件,但也可能是依赖项)是否失败

基于DLL的文件名,它听起来好像是针对C++库的调试版本构建的。不允许分发运行库的调试版本;您的源代码需要为您提供一个根据运行库的发布版本构建的DLL(可以在其DLL内启用调试,但它们不能使用调试运行时)。

除了“未找到DLL”,该错误消息还可能意味着未找到DLL的一个依赖项,DLL或其依赖项之一的体系结构与主机应用程序不同,或者初始化函数
DllMain
返回了故障代码

使用Process Monitor监视文件活动,并检查打开DLL文件(可能是DllImport中列出的文件,但也可能是依赖项)是否失败


基于DLL的文件名,它听起来好像是针对C++库的调试版本构建的。不允许分发运行库的调试版本;您的源代码需要为您提供一个针对运行库发布版本构建的DLL(可以在其DLL中启用调试,但它们不能使用调试运行时)。

只有在
公共类中以及在使用以下
命名空间时,
DllImport
才有效:

使用系统

使用System.Runtime


使用System.Runtime.InteropServices

只有在
公共类中使用并且使用以下
名称空间时,
DllImport
才有效:

使用系统

使用System.Runtime

使用System.Runtime.InteropServices

[DllImport(“DLL_名称”)]

和代码:

    if (!Environment.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.Process).Contains(HttpRuntime.BinDirectory))
        Environment.SetEnvironmentVariable("PATH", Environment.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.Process) + ";" + HttpRuntime.BinDirectory, EnvironmentVariableTarget.Process);
[DllImport(“DLL_名称”)]

和代码:

    if (!Environment.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.Process).Contains(HttpRuntime.BinDirectory))
        Environment.SetEnvironmentVariable("PATH", Environment.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.Process) + ";" + HttpRuntime.BinDirectory, EnvironmentVariableTarget.Process);

你能给我们提供错误信息吗?如果没有它或其他信息,将很难找出哪里出了问题。我在上面添加了错误详细信息。该dll必须与您的代码一起使用,而不是与第三方源代码一起使用。dll的要点是它不会编译到第三方库中。你们必须把它放在旁边。将它添加到您的项目中,并使其成为内容,如果更新,请复制。我还将程序集复制到了我的Bin文件夹中。还是一样的问题。我注意到的另一件事是,当我试图将该文件添加到引用中时,它引发了以下异常
,请确保该文件是可访问的,并且是有效的程序集或COM组件
@Californicated:您不能将其添加为引用。我认为tofutim建议将其作为资源添加。在您开始制作自己的安装程序包之前,它如何到达应用程序的bin目录并不重要。您能否向我们提供错误消息?如果没有它或其他信息,将很难找出哪里出了问题。我在上面添加了错误详细信息。该dll必须与您的代码一起使用,而不是与第三方源代码一起使用。dll的要点是它不会编译到第三方库中。你们必须把它放在旁边。将它添加到您的项目中,并使其成为内容,如果更新,请复制。我还将程序集复制到了我的Bin文件夹中。还是一样的问题。我注意到的另一件事是,当我试图将该文件添加到引用中时,它引发了以下异常
,请确保该文件是可访问的,并且是有效的程序集或COM组件
@Californicated:您不能将其添加为引用。我认为tofutim建议将其作为资源添加。在您开始制作自己的安装程序包之前,它如何到达应用程序的bin目录并不重要。如果它是COM DLL,他就不会谈论
DllImport
。它们是两种不同的互操作方法。这个问题有点困惑。这里可能有点混乱。我使用的是一个第三方.NET项目,它基本上是一个C++应用程序的包装器,名为QMSLIMSVCS10DLL。他们给了我这个文件,现在我在加载它时遇到了问题。他们在.NET库中的代码如下所示:
[DllImport(qmslDllName,SetLastError=true,CallingConvention=CallingConvention.Cdecl)]
只能将.NET作为