Tag: dllimport

C DLL中的PInvoke char *在C#中作为String处理。 null字符问题

C DLL中的函数如下所示: int my_Funct(char* input, char* output); 我必须从C#app调用它。 我这样做的方式如下: …DllImport stuff… public static extern int my_Funct(string input, string output); 输入字符串完美地传输到DLL(我有可见的certificate)。 function填写的输出虽然是错误的。 我有六进制数据,如: 3F-D9-00-01 但不幸的是,在两个零之后的所有内容都被剪切掉了,只有前两个字节来到我的C#应用​​程序。 它发生了,因为(我猜)它将它视为空字符并将其作为字符串的结尾。 任何想法我怎么能摆脱它? 我试图将它指定为IntPtr而不是字符串,但我不知道以后如何处理它。 我尝试过后: byte[] b1 = new byte[2]; Marshal.Copy(output,b1,0,2); 2通常应该是字节数组的长度。 但是我得到了各种错误:比如“请求的范围超出了数组的末尾”。 或“试图读取或写入受保护的内存……” 我感谢任何帮助。

P / Invoke动态DLL搜索路径

我有一个现有的应用程序P / Invokes到一个DLL与应用程序本身驻留在同一目录中。 现在(由于佳能生产了最疯狂的API之一)我需要支持这个API的两个版本,并在运行时确定我应该使用哪个(旧的或新的)。 由于DLL具有相同的名称(第一个加载具有相同名称的其他DLL,因此只重命名第一个将无法帮助我)我必须将它们保存在不同的目录中。 因此我的问题是:我有什么选项来控制DllImport声明中给出的DLL使用的目录? 我想我可以尝试以下两个想法中的任何一个: 1)在执行第一个P / Invoke之前使用“SetDllDirectory”设置我想要的目录,然后重置它。 2)使用“LoadLibraryEx”手动加载所需的DLL,并希望这样做。 但是,有没有更多的“.NET:ish方式”首先尝试? 更新:我意识到我可以在两个单独的.Net程序集中填充对DLL的所有访问权限,然后将它们中的每一个放在与相应API文件相对应的单独目录中。 然后我可以动态加载正确的.Net程序集,并自动加载正确的DLL。 有什么理由不行吗? 我能想到一个:我将如何调试这些东西? 有可能告诉Visual Studio一个程序集(包含在我的解决方案中)应该放在一个子目录中并从那里进行调试吗?

在哪里放DllImport?

static class Class { public static void methodRequiringStuffFromKernel32() { // code here… } } 我在哪里放[DllImport(“Kernel32.dll”)] ?

在C#中绑定C ++ DLL时的EntryPointNotFoundException

我尝试在我的c#控制台应用程序中绑定http://msdn.microsoft.com/en-us/library/ms235636.aspx中显示的简单c ++ dll,但是在运行时我在dll中得到了一个EntryPointNotFoundException。 我的测试课是 namespace BindingCppDllExample { public class BindingDllClass { [DllImport(“MathFuncsDll.dll”)] public static extern double Add(double a, double b); } public class Program { public static void Main(string[] args) { double a = 2.3; double b = 3.8; double c = BindingDllClass.Add(a, b); Console.WriteLine(string.Format(“{0} + {1} = {2}”, a, b, c)); } } } […]

从DLL调用函数?

我是C#的新手,我正在努力学习使用DLL。 我正在尝试将我的对象包装在DLL中,然后在我的程序中使用它。 public class Foo // its in the DLL { public int ID; public void Bar() { SomeMethodInMyProgram(); } } 所以我尝试将其打包到DLL但我不能,因为编译器不知道SomeMethodInMyProgram()是什么。 我想用它像: class Program // my program, using DLL { static void Main(string[] args) { Foo test = new Foo(); test.Bar(); } }

C#编组来自C ++ DLL的double *?

我有一个带有导出函数的C ++ DLL: extern “C” __declspec(dllexport) double* fft(double* dataReal, double* dataImag) { […] } 该函数计算两个双数组(实数和虚数)的FFT,返回单个双数组,实数为虚数组件交错:{Re,Im,Re,Im,…} 我不知道如何在C#中调用此函数。 我在做的是: [DllImport(“fft.dll”)] static extern double[] fft(double[] dataReal, double[] dataImag); 当我像这样测试它: double[] foo = fft(new double[] { 1, 2, 3, 4 }, new double[] { 0, 0, 0, 0 }); 我收到MarshalDirectiveExceptionexception: 无法封送“返回值”:无效的托管/非托管类型组合。 我假设这是因为C ++ double*与C# double[]不完全相同,但我不确定如何修复它。 有任何想法吗? 编辑:我已经更改了签名,以便我现在传递一些额外的信息: extern “C” […]

C#Struct No无参数构造函数? 看看我需要完成什么

我使用结构传递给非托管DLL,因为 – [StructLayout(LayoutKind.Sequential)] public struct valTable { public byte type; public byte map; public byte spare1; public byte spare2; public int par; public int min; public byte[] name; public valTable() { name = new byte[24]; } } 上面的代码将无法编译,因为VS 2005会抱怨“Structs不能包含显式无参数构造函数”。 为了将这个结构传递给我的DLL,我必须传递一个struct的数组,如valTable[] val = new valTable[281]; 我想要做的是当我说new ,构造函数被调用并且它创建了一个像我试图演示的字节数组,因为DLL正在寻找每个维度中大小为24的字节数组。 我怎么能做到这一点?

从C#调用C DLL

我试图从C#调用一个C DLL,但我没有任何快乐。 DLL的文档提供了VB的示例函数delaration,看起来像; Declare Function TransGeogPt Lib “c:\DLLS\GDAit.dll” (ByVal sGridFile As String, ByVal lDirection As Long, ByVal dLat As Double, ByVal dLong As Double, pdLatNew As Double, pdLongNew As Double, pdLatAcc As Double, pdLongAcc As Double) As Long Declare Function TransProjPt Lib “c:\DLLS\GDAit.dll” (ByVal sGridFile As String, ByVal lDirection As Long, ByVal dLat As Double, […]

“无法在dll中找到名为的入口点”(c ++到c#类型转换)

我有一个来自第三方的dll,它是用C ++编写的。 以下是来自dll文档的一些信息: //start documentation RECO_DATA{ wchar_t Surname[200]; wchar_t Firstname[200]; } 描述:用于接收function结果的数据结构。 所有function结果将存储为Unicode(UTF-8)。 方法: bool recoCHN_P_Name(char *imgPath,RECO_DATA *o_data); 输入: char * imgPath 此function识别的图像位置的完整路径 RECO_DATA * o_data 用于接收function结果的数据对象。 函数返回:如果成功则返回true,否则返回false。 //end documentation 我试图从我的C#应用​​程序调用recoCHN_P_Name。 为此,我想出了这段代码: 导入dll的代码: public class cnOCRsdk { [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] public struct RECO_DATA{ [MarshalAs(UnmanagedType.ByValTStr, SizeConst=200)] public string FirstName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 200)] public string […]

DllImport – 尝试加载格式不正确的程序

我希望我的C#应用​​程序有条件地运行本机方法。 在运行时决定是运行dll的x86还是x64版本。 这个问题解释了如何在编译时选择32位或64位,但这没有帮助。 我想在运行时做出决定。 我目前正在做以下事情: [SuppressUnmanagedCodeSecurity] internal static class MiniDumpMethods { [DllImport(“dbghelp.dll”, EntryPoint = “MiniDumpWriteDump”, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool MiniDumpWriteDump( IntPtr hProcess, uint processId, SafeHandle hFile, MINIDUMP_TYPE dumpType, IntPtr expParam, IntPtr userStreamParam, IntPtr callbackParam); [DllImport(“dbghelpx86.dll”, EntryPoint = “MiniDumpWriteDump”, CallingConvention = CallingConvention.StdCall, […]