标签: dllimport

如何在运行时指定[DllImport]路径?

事实上,我得到了一个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# c++ dll constants dllimport

129
推荐指数
5
解决办法
13万
查看次数

是否有任何本机DLL导出函数查看器?

是否有任何免费的本机Windows DLL导出函数查看器,它显示函数名称及其参数列表?

dll native function dllimport

88
推荐指数
4
解决办法
11万
查看次数

将非托管dll嵌入到托管C#dll中

我有一个使用DLLImport使用非托管C++ DLL的托管C#dll.一切都很好.但是,我想在我的托管DLL中嵌入非托管DLL,如Microsoft解释:

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.dllimportattribute.aspx

所以我将非托管dll文件添加到我的托管dll项目,将属性设置为'Embedded Resource'并将DLLImport修改为:

[DllImport("Unmanaged Driver.dll, Wrapper Engine, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=null",
CallingConvention = CallingConvention.Winapi)]
Run Code Online (Sandbox Code Playgroud)

其中'Wrapper Engine'是我托管DLL的程序集名称'Unmanaged Driver.dll'是非托管DLL

当我跑步时,我得到:

访问被拒绝.(HRESULT异常:0x80070005(E_ACCESSDENIED))

我从MSDN和http://blogs.msdn.com/suzcook/看到了这应该是可能的......

c# unmanaged managed dllimport

82
推荐指数
4
解决办法
6万
查看次数

什么是[DllImport("QCall")]?

.Net库中的许多方法都是在本机代码中实现的.那些来自框架本身的标记着[MethodImpl(MethodImplOptions.InternalCall)].来自某些非托管DLL的那些标记有[DllImport](例如[DllImport("kernel32.dll")]).到目前为止没有什

但在为另一个问题答案时,我发现有许多标记的方法[DllImport("QCall")].它们似乎是.Net的内部实现(例如GC._Collect()).

我的问题是:究竟是什么[DllImport("QCall")]意思?[DllImport("QCall")]和之间有什么区别[MethodImpl(MethodImplOptions.InternalCall)]

.net internals dllimport

67
推荐指数
2
解决办法
6048
查看次数

在C#DllImport中使用32位或64位dll

这是情况,我在我的dot.net应用程序中使用基于C的dll.有2个dll,一个是32位称为MyDll32.dll,另一个是64位版本,名为MyDll64.dll.

有一个保存DLL文件名的静态变量:string DLL_FILE_NAME.

它以下列方式使用:

[DllImport(DLL_FILE_NAME, CallingConvention=CallingConvention.Cdecl, EntryPoint=Func1")]
private static extern int is_Func1(int var1, int var2);
Run Code Online (Sandbox Code Playgroud)

到目前为止简单.

可以想象,该软件是在打开"Any CPU"的情况下编译的.

我还有以下代码来确定系统是否应该使用64位文件或32位文件.

#if WIN64
        public const string DLL_FILE_NAME = "MyDll64.dll";
#else
        public const string DLL_FILE_NAME = "MyDll32.dll";        
#endif
Run Code Online (Sandbox Code Playgroud)

到目前为止,您应该看到问题.. DLL_FILE_NAME是在编译时定义的,而不是在执行时间中定义的,因此根据执行上下文不会加载右dll.

处理这个问题的正确方法是什么?我不想要两个执行文件(一个用于32位,另一个用于64位)?如何在DllImport语句中使用DLL_FILE_NAME 之前设置它?

.net c# pinvoke dllimport 32bit-64bit

59
推荐指数
4
解决办法
5万
查看次数

在.NET中指定DllImport的搜索路径

有没有办法为使用DllImport导入的给定程序集指定要搜索的路径?

[DllImport("MyDll.dll")]
static extern void Func();
Run Code Online (Sandbox Code Playgroud)

这将在app dir和PATH环境变量中搜索dll.但有时dll会放在其他地方.可以在app.config或清单文件中指定此信息以避免动态加载和动态调用吗?

.net dllimport

53
推荐指数
3
解决办法
3万
查看次数

从C++调用DLL中的函数

我在VS 2008中有一个解决方案,里面有2个项目.一个是用C++编写的DLL,另一个是从空白项目创建的简单C++控制台应用程序.我想知道如何从应用程序调用DLL中的函数.

假设我从一个空白的C++项目开始,我想调用一个名为的函数 int IsolatedFunction(int someParam)

我怎么称呼它?

c++ dll dllimport visual-studio-2008

39
推荐指数
4
解决办法
10万
查看次数

PInvokeStackImbalance C#调用非托管C++函数

切换到VS2010后,托管调试助手在从C#应用程序调用非托管C++函数时显示有关不平衡堆栈的错误.

通常的嫌疑人似乎没有引起这个问题.还有别的我应该检查一下吗?VS2008构建的C++ DLL和C#应用程序从来没有出现问题,没有奇怪或神秘的错误 - 是的,我知道这并不意味着什么.

以下是检查的内容:

  • dll名称是正确的.
  • 入口点名称是正确的,并已使用depends.exe验证 - 代码必须使用受损的名称,它确实如此.
  • 调用约定是正确的.
  • 尺寸和类型似乎都是正确的.
  • 字符集是正确的.
  • 忽略错误后似乎没有任何问题,并且在调试器外部运行时没有问题.

C#:

[DllImport("Correct.dll", EntryPoint = "SuperSpecialOpenFileFunc", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, ExactSpelling = true)]
public static extern short SuperSpecialOpenFileFunc(ref SuperSpecialStruct stuff);

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
public struct SuperSpecialStruct
{
   public int field1;
   [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
   public string field2;
   [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
   public string field3;
   [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
   public string field4;
   public ushort field5;
   public ushort field6;
   public ushort field7;
   public …
Run Code Online (Sandbox Code Playgroud)

c# c++ pinvoke dllimport visual-studio-2010

39
推荐指数
3
解决办法
4万
查看次数

为何/何时不需要__declspec(dllimport)?

在使用server.dll和client.exe的项目中,我dllexport从服务器dll编辑了一个服务器符号,而不是将其 dllimport编辑到客户端exe中.

仍然,应用程序链接,并启动,没有任何问题.是dllimport不需要的,那么???

细节:

我有这个'服务器'DLL:

// server.h
#ifdef SERVER_EXPORTS
  #define SERVER_API __declspec(dllexport)
#else
  #define SERVER_API // =====> not using dllimport!
#endif
class  SERVER_API CServer {
   static long s;
   public:
   CServer();
};

// server.cpp
CServer::CServer(){}

long CServer::s;
Run Code Online (Sandbox Code Playgroud)

这个客户端可执行文件

#include <server.h>
int main() {
   CServer s;
}
Run Code Online (Sandbox Code Playgroud)

服务器命令行:

cl.exe /Od  /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_USRDLL" 
 /D "SERVER_EXPORTS" /D "_UNICODE" /D "UNICODE" /D "_WINDLL" 
 /Gm /EHsc /RTC1 /MDd /Yu"stdafx.h" 
 /Fp"Debug\server.pch" /Fo"Debug\\" /Fd"Debug\vc80.pdb" 
 /W3 /nologo …
Run Code Online (Sandbox Code Playgroud)

c++ dllimport visual-c++-2005 declspec

37
推荐指数
1
解决办法
9279
查看次数

如何在C#中使用[DllImport("")]?

我发现了很多关于它的问题,但是没有人解释我如何使用它.

我有这个:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using Microsoft.FSharp.Linq.RuntimeHelpers;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.IO;

public class WindowHandling
{
    public void ActivateTargetApplication(string processName, List<string> barcodesList)
    {
        [DllImport("User32.dll")]
        public static extern int SetForegroundWindow(IntPtr point);
        Process p = Process.Start("notepad++.exe");
        p.WaitForInputIdle();
        IntPtr h = p.MainWindowHandle;
        SetForegroundWindow(h);
        SendKeys.SendWait("k");
        IntPtr processFoundWindow = p.MainWindowHandle;
    }
}
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我理解为什么它会在DllImport线路和线路上给我一个错误public static吗?

有没有人有想法,我该怎么办?谢谢.

c# process dllimport

35
推荐指数
1
解决办法
17万
查看次数