Tag: dllimport

C#中的C ++ Struct

我使用DllImport在我的C#项目中使用C ++编写的DLL,我使用的其中一个函数如下所示: [DllImport(“dds.dll”, CharSet = CharSet.Auto)] private static extern int Par( ddTableResults2 tableResult, ref parResults ParResult, int vul ); parResults结构在C ++中定义如下: struct parResults { /* index = 0 is NS view and index = 1 is EW view. By ‘view’ is here meant which side that starts the bidding. */ char parScore[2][16]; char parContractsString[2][128]; }; […]

如何从C#windows应用程序项目调用C ++ DLL

我使用Visual Studio中的类库项目在C ++中创建了一个dll。 我需要从C#应用程序中调用dll中的方法。 我知道有2个approches。 一种是将dll项目引用添加到C#项目或使用DllExport导出方法。 但是,当我尝试两种方式时,它总是在运行时调用dll方法时出现以下错误。 TestClient.exe中发生未处理的“System.BadImageFormatException”类型exception附加信息:尝试加载格式不正确的程序。 (HRESULTexception:0x8007000B) 我可以知道如何避免这个问题吗? 提前致谢!

P /调用函数传递StringBuilder

在C#文件中我有一个 class Archiver { [DllImport(“Archiver.dll”)] public static extern void archive(string data, StringBuilder response); } 字符串数据是一个输入,StringBuilder响应是函数写入的东西 归档函数原型(用C编写)如下所示: void archive(char * dataChr, char * outChr); 它在dataChr中接收一个字符串,然后执行a strcpy(outChr,”some big text”); 从C#我称之为: string message = “some text here”; StringBuilder response = new StringBuilder(10000); Archiver.archive(message,response); 这是有效的,但问题是,你可能会看到我给StringBuilder大小一个值,但是归档函数可能会返回一个(方式)更大的文本,而不是我给我的StringBuilder的大小。 有任何解决这个问题的方法吗?

从文件句柄中获取文件名?

我将ntdll.dll的NtCreateFile()函数挂钩以允许/拒绝某些文件的访问。 与kernel32.dll的CreateFile()不同,它很容易为您提供相关文件的完整路径,ntdll.dll的NtCreateFile()函数只为您提供文件的句柄。 我需要从文件句柄获取文件的完整路径,从而允许/拒绝访问。 我一直在搜索,似乎没有一个有效的C#解决方案。 此解决方案使用C ++编写,并在Microsoft中进行了记录。 我试图将它移植到C#并没有太大的成功。 这是我尝试C#等效的C ++版本“从文件句柄获取文件名”: public string GetFileNameFromHandle(IntPtr FileHandle) { string fileName = String.Empty; IntPtr fileMap = IntPtr.Zero, fileSizeHi = IntPtr.Zero; UInt32 fileSizeLo = 0; fileSizeLo = GetFileSize(FileHandle, fileSizeHi); if (fileSizeLo == 0 && fileSizeHi == IntPtr.Zero) { // cannot map an 0 byte file return String.Empty; } fileMap = CreateFileMapping(FileHandle, […]

在c#项目中导入c ++ dll

我正在将一些c ++ dll导入到ac #project中,我正在使用visual studio 2010.我已经成功导入了使用内置类型的函数,但是当我尝试处理结构时遇到错误。 这是一个简单的例子: c ++代码 typedef long int TDate; typedef struct _TMDYDate { long month; /* In range [1,12] */ long day; /* In range [1-31] */ long year; /* In range [1600-] */ } TMonthDayYear; int JpmcdsDateToMDY (TDate date, /* (I) TDate format */ TMonthDayYear *mdyDate); 我已翻译成c#: [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] public struct […]

关于c#的DllImport

如何在C#中访问C ++ DLL的function 以下是DLL的原型: NOMANGLE int CCONV SSPSendCommand (SSP_COMMAND * cmd, SSP_COMMAND_INFO * sspInfo); NOMANGLE int CCONV OpenSSPComPort (SSP_COMMAND * cmd); NOMANGLE int CCONV OpenSSPComPort2 (SSP_COMMAND * cmd); NOMANGLE int CCONV OpenSSPComPortUSB (SSP_COMMAND * cmd); NOMANGLE int CCONV CloseSSPComPort (void); NOMANGLE int CCONV CloseSSPComPort2 (void); NOMANGLE int CCONV CloseSSPComPortUSB (void); NOMANGLE int CCONV DownloadFileToTarget (char […]

SharePoint无法在Windows 2008上加载C ++ DLL

我有一个SharePoint DLL,它可以执行一些许可,并且作为代码的一部分,它使用外部C ++ DLL来获取硬盘的序列号。 当我在Windows Server 2003上运行此应用程序时,它工作正常,但在Windows Server 2008上,整个站点(加载时加载)会不断崩溃和重置。 这不是Windows Server 2008 R2,在64位或32位中是相同的。 如果我在DLL执行之前放置一个Debugger.Break ,那么我会看到代码到达中断点,然后再也不会再回到DLL中。 我确实从函数内部获得了一些调试断言警告,仅在Windows Server 2008中,但我不确定这是否相关。 我创建了一个运行C#DLL的控制台应用程序,后者又加载了C ++ DLL,这在Windows Server 2008上完美运行(虽然它确实显示了断言错误,但我现在已经抑制了这些)。 断言错误不在我的代码中,而是在ICtypes.c ,而不是我可以调试的东西。 如果我在DLL中放置一个断点,它永远不会被命中,编译器说: “step in: Stepping over non user code” 如果我尝试使用Visual Studio调试DLL。 我已经尝试包装用于调用DLL的代码: SPSecurity.RunWithElevatedPrivileges(delegate() 但这也无济于事。 我有这个DLL的源代码,所以这不是一个问题。 如果我从目录中删除DLL,我会收到有关丢失的DLL的错误。 如果我更换它,请回到没有错误或警告完全失败。 如果我用硬编码字符串替换此代码,整个应用程序工作正常。 任何建议都将非常感激,我无法理解为什么它作为控制台应用程序工作,但不是由SharePoint运行。 这是在同一台机器上使用相同的用户帐户… 这是用于调用DLL的代码: [DllImport(“idDll.dll”, EntryPoint = “GetMachineId”, SetLastError = true)] extern static string […]

C#的问题 C ++ DLLImport“试图读取或写入受保护的内存。”

我有一个C ++ DLL,其中有一个函数,我试图从C#应用程序调用。 这是C ++头文件中的代码 extern “C” _declspec(dllexport) int LabelStoringSSDsim(int devNum, UCHAR serial[40], UCHAR wwn[40], UCHAR ConfigID[5], UCHAR FrmRev[8], UCHAR DevName[40], int eCode); 这是C ++源文件中的代码 int LabelStoringSSDsim(int devNum, UCHAR serialLbl[40], UCHAR wwnLbl[40], UCHAR ConfigID[5], UCHAR FrmRev[8], UCHAR DevName[40], int eCode) { string strConfigID=”12111″; //5 bytes string strFrmRev=”1.25….”; //8 bytes string strDevName=”ABC-123……………………………”; //40 bytes for (int […]

将C ++ dll导出到c#

‘using System; ‘using System.Collections.Generic; ‘using System.Drawing; ‘using System.Windows.Forms; ‘using Emgu.CV; ‘using Emgu.CV.Structure; ‘using Emgu.CV.CvEnum; ‘using System.IO; ‘using System.Diagnostics; ‘using System.Runtime.InteropServices; ‘namespace FaceStat ‘{ ‘class Form1 : Form { // public static extern void AsmSearchDll(out int nlmarks, out int lmarks, string imgname, byte imgdata, int width, int height, int is_color, string conf_file0, string conf_file1); [DllImport(@”../data/stasm_dll.dll”)] public […]

FreeLibrary无限期地返回true

有没有理由说FreeLibrary会重复返回true? 我正试图从我的进程中卸载一些本机dll,所以我得到它的句柄,然后调用FreeLibrary直到引用计数变为零,因此FreeLibrary返回false …但它永远不会: IntPtr pDll = DllLoadingImports.LoadLibrary(dllTounLoad); //throw if pDll == IntPtr.Zero while(DllLoadingImports.FreeLibrary(pDll)); 代码运行,永不返回。 进程资源管理器也会显示仍然加载的dll。 更多背景: 我正在尝试卸载使用DllImport加载的本机库,我正在使用这里描述的技巧: https ://stackoverflow.com/a/2445558/2308106这是为了进行原型设计,所以我不必关心可能的结果…但我很困惑为什么图书馆不会卸载 编辑1 :我发现通过在GetModuleHandleEx函数中指定GET_MODULE_HANDLE_EX_FLAG_PIN标志可以实现类似的行为(可以在dll加载时从DllMain中调用)。 我试图卸载的DLL是python.dll(更准确地说是python36.dll)。 但是在python源代码中没有找到这个标志的用法。 DllMain本身是空的。 编辑2 :我被问到最小的可执行示例 – 所以这里它:它使用pythonnet库(版本2.3.0) – 这是PythonEngine调用。 [TestFixture] public class PythonUnloadTest { public static class DllImports { [DllImport(“kernel32.dll”)] public static extern IntPtr LoadLibrary(string dllToLoad); [DllImport(“kernel32.dll”)] public static extern bool FreeLibrary(IntPtr hModule); } […]