好的,我从官方网站下载了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#dll?
我想为WinAPI调用WritePrivateProfileString等编写一个替换库来读取和写入ini文件.
是否可以导出一个函数,例如'WritePrivateProfileString',在C#中实现,这样可以用DllImport对dll进行pinvoke?
我想用托管dll替换本机dll,因此托管dll会被pinvoke调用(而不是本机dll,当托管dll在bin目录中时)调用.
我有以下使用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 ++创建了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的用户编组错误,这可能会破坏堆栈.
字符串类型有什么问题?如何解决这个问题?
我正在编写一个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++ 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 值?
任何帮助,将不胜感激。谢谢。
我有一个本机/非托管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)
有任何想法吗?
我需要将 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) 我的一个项目要求我从路径中获取特定文件夹的图标。
例如:
如果我使用C:\Users\Username\Desktop我想获取与桌面文件夹关联的图标
如果我使用具有自定义图标的文件夹的路径,我想获取该图标
不,我不想要通用默认文件夹图标
我一直在寻找近 3 天没有运气。任何帮助表示赞赏。
我在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上.