标签: pinvoke

BadImageFormatException:PInvoke ImportDll with hdf5dll.dll

好的,我从官方网站下载了HDF5库,我有一些DLL,包括hdf5dll.dll和hdf5_hldll.dll.

我有我的想法是围绕本地调用一些包装,在我的课H5,H5LT,H5F,和H5T.来自H5.cs的示例:

namespace HDF5
{
    using hid_t = System.Int32;
    using herr_t = System.Int32;
    using hsize_t = System.UInt64;
    using size_t = System.UInt32;
    // hbool_t is 0:false, +:true
    using hbool_t = System.UInt32;
    // htri_t is 0:false, +:true, -:failure
    using htri_t = System.Int32;

    public class H5
    {
        const CharSet StringMarshallingType = CharSet.Ansi;
        const string DLLNAME = "hdf5dll.dll";
Run Code Online (Sandbox Code Playgroud)

        ///* Functions in H5.c */
        //H5_DLL herr_t H5open(void);
        [DllImport(DLLNAME,
            CharSet = StringMarshallingType)]
        public static extern herr_t H5open();
Run Code Online (Sandbox Code Playgroud)

在Program.cs中,我使用 …

c# pinvoke hdf5

2
推荐指数
1
解决办法
1932
查看次数

C#DLL可以被截去?

问题:是否可以编写可以被限制的C#dll?

我想为WinAPI调用WritePrivateProfileString等编写一个替换库来读取和写入ini文件.

是否可以导出一个函数,例如'WritePrivateProfileString',在C#中实现,这样可以用DllImport对dll进行pinvoke?

我想用托管dll替换本机dll,因此托管dll会被pinvoke调用(而不是本机dll,当托管dll在bin目录中时)调用.

.net c# pinvoke dllimport

2
推荐指数
1
解决办法
261
查看次数

C#中的PInvoke代码用法

我有以下使用DLLImport的C#代码.

using System;

namespace LvFpga {
  class RegTest 
  {

    [DllImport("kernel32")]    
    public extern static int LoadLibrary(string lpLibFileName);
    [DllImport("kernel32")]    
    public extern static bool FreeLibrary(int hLibModule); 

    public static bool IsDllRegistered(string DllName)    
    {    
      int libId = LoadLibrary(DllName);
      if (libId>0) FreeLibrary(libId);
      return (libId>0);    
    }
    public static void Main(string[] args)
    {
        Console.WriteLn(IsDllRegistered("msdia100.dll"));
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

当我运行时,csc CSCODE.cs我得到了错误.

regtest.cs(7,6): error CS0246: The type or namespace name 'DllImport' could not be found (are you
        missing a using directive or an assembly reference?)
regtest.cs(7,6): error CS0246: The …
Run Code Online (Sandbox Code Playgroud)

c# pinvoke dllimport

2
推荐指数
1
解决办法
3914
查看次数

来自C#代码的dll函数调用期间出错

我用c ++创建了dll,想用c#调用它的函数.我有一个错误,如果函数,程序调用,返回字符串. Dll代码:

#include <string>
using namespace std;
#define EXPORT_API extern "C" __declspec(dllexport) 
EXPORT_API  void DllFunc()
{
    MessageBoxA(0,"DDL box", "Yeah!", 0);
}

EXPORT_API  string DllFuncStr()
{
    return "testStr";
}
Run Code Online (Sandbox Code Playgroud)

C#应用程序代码:

[DllImport("dllka.dll")]
 static extern void DllFunc();
[DllImport("dllka.dll")]
static extern string DllFuncStr();

 private void btnStart_Click(object sender, RoutedEventArgs e)
 {
     DllFunc();
     string str = DllFuncStr();           
 }
Run Code Online (Sandbox Code Playgroud)

"DllFunc();" - 效果不错,但在线"string str = DllFuncStr();" 我有一个错误:

运行时遇到了致命错误.错误的地址位于0x5e6dceca,位于线程0x16b0上.错误代码是0xc0000005.此错误可能是CLR中的错误,也可能是用户代码的不安全或不可验证部分中的错误.此错误的常见来源包括COM-interop或PInvoke的用户编组错误,这可能会破坏堆栈.

字符串类型有什么问题?如何解决这个问题?

c# c++ pinvoke

2
推荐指数
1
解决办法
1635
查看次数

从C#调用dll函数时的PInvokeStackImbalance

我正在编写一个WPF应用程序,需要调用我编写的dll中存在的一些C++代码.我总是得到PInvokeStackImbalance错误,即使是最基本的测试功能.例如,在C++ DLL中:

extern "C" __declspec(dllexport) void Test( int foo);
Run Code Online (Sandbox Code Playgroud)

该功能什么都不做.c#侧看起来像这样:

    [DllImport("myDll.dll", CharSet = CharSet.Auto)]
    private static extern void Test( int foo);
Run Code Online (Sandbox Code Playgroud)

我称之为c#函数是这样的:

测试(1)

......我得到了一个PInvokeStackImbalance !! 怎么会这样?

提前致谢...

汤姆

c# pinvoke dllimport dllexport

2
推荐指数
1
解决办法
484
查看次数

尝试将指向 unsigned long 的 C++ 指针编组为 C# ulong

我有一个 C++ DLL,我正在尝试使用 C# 与之交互。我无权访问 DLL 源代码,因此无法更改。我需要调用的方法之一包含一个指向 unsigned long 的指针:

int __stdcall Foo(FooHandle messageHandle, unsigned long* tag, char* part, char* value)
Run Code Online (Sandbox Code Playgroud)

我已经创建了一个具有相同方法签名的测试 DLL 项目,因此我可以尝试解决这个问题,但是我没有成功地让 DLL 更改指针所引用的 unsigned long 的值并将该值取回C# 方面。C# 端声明是:

[DllImport("Foo.dll", EntryPoint = "Foo", CallingConvention = CallingConvention.StdCall)]
    public static extern int Foo(int messageHandle, IntPtr tag, StringBuilder part, StringBuilder value);
Run Code Online (Sandbox Code Playgroud)

当我从 C# 调用然后尝试将 IntPtr 转换为 Int32 或 Int64 时,我得到零。我已经在这里和一般的网络以及 MSDN 上进行了搜索,但似乎无法找到有关如何执行此操作的解释。我认为 char* 将是困难的部分,但 StringBuilder 可以正常工作。

如何使用 C++ DLL 更改指针传递的 unsigned long 值?

任何帮助,将不胜感激。谢谢。

c# pinvoke

2
推荐指数
1
解决办法
4237
查看次数

来自C#的P/Invoke:调用返回对象的函数

我有一个本机/非托管DLL,它有一个"CreateObject"函数,它返回一个指向业务对象的指针..所以调用将是...... 喜欢:

[DllImport("MyDll.dll", CharSet = CharSet.Auto)]
private static extern IntPtr CreateObject();
Run Code Online (Sandbox Code Playgroud)

问题:对象是暴露我想要调用的"Connect()"之类的公共函数,但我不知道如何"映射"这些调用,所以我有一个简单的方法签名,如:

private bool Connect();
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

.net c# pinvoke unmanaged c++-cli

2
推荐指数
1
解决办法
926
查看次数

使用 p/invoke 将字符串数组从 C# 编组到 C 代码

我需要将 C# 字符串数组传递到 C 代码中

示例 C 代码

void print_string_array(const char** str_array, int length){
    for (int i = 0; i < length; ++i) {
        printf("Sting[%l] = %s\n", i, str_array[i]);
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试过的 C#(这不起作用)

string foo[] = {"testing", "one", "two", "three"};  
print_string_array(foo, foo.Length);

[DllImport(my_C_dll, CharSet = CharSet.Ansi)]
private static extern void print_string_array([In][MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPStr)] string[] sa, int length);
Run Code Online (Sandbox Code Playgroud)

因 System.AccessViolationException 失败 System.AccessViolationException:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

我也试过(这也不起作用)

string[] foo = {"testing", "one", "two", "three"};  
IntPtr[] s_array = new IntPtr[foo.Length];

for(int i = 0; i < foo.Length; …
Run Code Online (Sandbox Code Playgroud)

.net c++ pinvoke interop marshalling

2
推荐指数
1
解决办法
7727
查看次数

如何获取与特定文件夹关联的图标?

我的一个项目要求我从路径中获取特定文件夹的图标。

例如:
如果我使用C:\Users\Username\Desktop我想获取与桌面文件夹关联的图标
如果我使用具有自定义图标的文件夹的路径,我想获取该图标

不,我不想要通用默认文件夹图标

我一直在寻找近 3 天没有运气。任何帮助表示赞赏。

c# directory pinvoke icons winforms

2
推荐指数
1
解决办法
3567
查看次数

CoTaskMemAlloc v malloc v AllocHGlobal

我在Windows上看过,malloc与CoTaskMemAlloc不同,后者与AllocHGlobal不同.对于C#使用者来说,这可能意味着如果我有一个返回malloc指针的C函数,我需要在其上调用free.如果IP/Invoke并指定字符串返回类型,则CLR应该调用CoTaskMemFree并且应该在malloc指针上失败.

但是,我无法在实践中看到这一点.我创建了一个DLL,它只返回一个malloc'd char*和P/Invoked它作为一个字符串.没有内存泄漏.实际上,无论我尝试什么,我都无法让事情失败.我调用malloc,GlobalHAlloc,CoTaskMemAlloc,然后使用任何免费的实现,只是工作.没有内存泄漏.重新使用相同的内存空间.

我怎么能强迫它失败?或者这是那些应该是"实现定义"的东西,但实际上只是单向工作?

这是在VS2015 Update 2,Windows 8.1上.

c c# pinvoke winapi

2
推荐指数
1
解决办法
1098
查看次数

标签 统计

pinvoke ×10

c# ×9

.net ×3

dllimport ×3

c++ ×2

c ×1

c++-cli ×1

directory ×1

dllexport ×1

hdf5 ×1

icons ×1

interop ×1

marshalling ×1

unmanaged ×1

winapi ×1

winforms ×1