事实上,我得到了一个C++(工作)DLL,我想导入我的C#项目来调用它的函数.
当我指定DLL的完整路径时,它确实有效,如下所示:
string str = "C:\\Users\\userName\\AppData\\Local\\myLibFolder\\myDLL.dll";
[DllImport(str, CallingConvention = CallingConvention.Cdecl)]
public static extern int DLLFunction(int Number1, int Number2);
Run Code Online (Sandbox Code Playgroud)
问题是它将是一个可安装的项目,因此用户的文件夹将不同(例如:皮埃尔,保罗,杰克,妈妈,爸爸......),这取决于计算机/会话的运行情况.
所以我希望我的代码更通用,如下所示:
/*
goes right to the temp folder of the user
"C:\\Users\\userName\\AppData\\Local\\temp"
then go to parent folder
"C:\\Users\\userName\\AppData\\Local"
and finally go to the DLL's folder
"C:\\Users\\userName\\AppData\\Local\\temp\\myLibFolder"
*/
string str = Path.GetTempPath() + "..\\myLibFolder\\myDLL.dll";
[DllImport(str, CallingConvention = CallingConvention.Cdecl)]
public static extern int DLLFunction(int Number1, int Number2);
Run Code Online (Sandbox Code Playgroud)
最重要的是"DllImport"需要DLL目录的"const string"参数.
所以我的问题是::在这种情况下可以做些什么?
我在C#visual studio项目中遇到以下错误:
命名空间"Microsoft"中不存在类型或命名空间名称"VisualStudio"(您是否缺少程序集引用?)
我也试图找到microsoft.dll文件,但无法获得任何参考.我在搜索错误的DLL吗?
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Kya.MsFx.Services.Swiper;
namespace Kya.MsFx.Devices.Swiper.Test
{
[TestClass]
public class SwiperWindowTest
{
private SwiperWebServiceHost m_SwiperWS = null;
/// <summary>
/// start web service on a separate thread, so tests
/// can be executed withut blocking the application thread
/// </summary>
[ClassInitialize]
public void SetupSwiperTests() {
m_SwiperWS = SwiperWebServiceHost.StartService();
}
/// <summary>
/// Stop service started during class initialize and kill the thread
/// </summary>
[ClassCleanup]
public void CleanupSwiperTests() {
m_SwiperWS.Stop();
}
/// <summary>
/// simulate init, …
Run Code Online (Sandbox Code Playgroud) 我开发了一个依赖于DLL文件的应用程序.当我调试我的应用程序时,应用程序会抱怨:
"此应用程序无法启动,因为找不到xxx.dll."
所以我必须将DLL文件复制到与我的.vcproj文件相同的目录中.
有没有办法设置项目在(最好)一些相对路径或(不是首选)某些绝对路径中查找DLL文件?
与我们如何在项目设置中设置包含和库路径的概念类似.
我的意思是当我调试我的应用程序(点击F5)时会弹出上面的错误.
我有我需要在我的.NET 4.0应用程序中使用的非托管C++ API代码的DLL库.但我尝试加载我的DLL的每个方法都会出错:
无法加载DLL"MyOwn.dll":找不到指定的模块.(来自HRESULT的异常:0x8007007E)
我已阅读并尝试了我在互联网上找到的severa解决方案.什么都行不通..
我尝试过使用以下方法:
[DllImport("MyOwn.dll", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs((UnmanagedType.I4))]
public static extern Int32 MyProIni(string DBname, string DBuser_pass,
string WorkDirectory, ref StringBuilder ErrorMessage);
Run Code Online (Sandbox Code Playgroud)
当我尝试按照这篇文章和我运行这个例子时(从下载的代码中)它运行没有问题(使用的DLL在bin/debug文件夹中)
我已将我的dll(以及它所依赖的所有文件复制到我的bin文件夹中).
我也试过这种方法,但得到了同样的错误:
[DllImportAttribute(MyOwnLibDllPath, EntryPoint="TMproIni")]
[return: MarshalAs(UnmanagedType.I4)]
public static extern int MyproIni(string DBname, string DBuser_pass,
string WorkDirectory, ref StringBuilder ErrorMessage);
Run Code Online (Sandbox Code Playgroud)
有什么建议?
作为构建过程的一部分,我需要为所有已编译的二进制文件设置版本信息.一些二进制文件已经有版本信息(在编译时添加),有些则没有.
我希望能够应用以下信息:
所有这些属性都由构建脚本指定,并且必须在编译后应用.这些是使用C++ Builder 2007编译的标准二进制文件(而不是程序集).
我怎样才能做到这一点?
我有一个非常像ImportError的情况:DLL加载失败:%1不是一个有效的Win32应用程序,但答案不适合我.
我的Python代码说:
import cv2
Run Code Online (Sandbox Code Playgroud)
但该行抛出了此问题标题中显示的错误.
我C:\lib\opencv
在这台64位机器上安装了OpenCV .我正在使用64位Python.
我的PYTHONPATH变量:PYTHONPATH=C:\lib\opencv\build\python\2.7
.这个文件夹包含cv2.pyd
,就是全部.
我的PATH变量:Path=%OPENCV_DIR%\bin;...
此文件夹包含39个DLL文件,例如opencv_core246d.dll
.
OPENCV_DIR具有此值:OPENCV_DIR=C:\lib\opencv\build\x64\vc11
.
ImportError的解决方案:DLL加载失败:%1不是有效的Win32应用程序,说"将新的opencv二进制文件路径(C:\opencv\build\bin\Release
)添加到Windows PATH环境变量".但是如上所示,C:\lib\opencv\build\x64\vc11\bin
我的PATH中已经有OpenCV二进制文件夹().我的OpenCV安装没有任何Release文件夹(build/java下的空文件夹除外).
关于出了什么问题的任何想法?我可以告诉Python详细跟踪加载过程吗?究竟是什么DLL正在寻找?
谢谢,拉尔斯
我只注意到,根据http://www.dependencywalker.com/中,cv2.pyd
在C:\lib\opencv\build\python\2.7
为32位,而机器和我跑了Python是64位.这可能是问题吗?如果是这样,我在哪里可以找到64位版本的cv2.pyd?
如何确定.NET应用程序的依赖项?Dependency Walker是否适用于托管应用程序?我已经下载了最新的并尝试过分析应用程序,但它只是在没有太多解释的情况下退出.如果它不能与.NET一起使用,那么是否有其他工具可以帮助我调试运行时DLL加载问题?
我试过使用以下代码:
cd c:\windows\system32
regsvr32.exe dllname.ax
Run Code Online (Sandbox Code Playgroud)
但这不适合我.如何在Windows 7上使用64位处理器注册DLL文件?