标签: pinvoke

DllImport不完整的名字

我在.NET下使用了几个P/Invokes.但是,我希望我的库可以在Windows和Linux中工作,最好使用相同的二进制文件.

由于我所依赖的本机库可以在多个平台上使用,因此我希望将它们与托管库的二进制文件一起使用.

现在我正在使用这样的东西:

[DllImport("/usr/lib/libMYLIBNAME.so.1")]
Run Code Online (Sandbox Code Playgroud)

但这显然只适用于Linux.我正在考虑我可以从/ usr/lib复制那个二进制文件并随我的应用程序一起分发,所以我可以将上面的内容减少到:

[DllImport("libMYLIBNAME.so")]
Run Code Online (Sandbox Code Playgroud)

但这仍然只是Linux.

无论如何都要更改库名称字符串,以便它在Linux下查找libMYLIBNAME.so和Windows上的MYLIBNAME.dll,或者非常类似的东西?

我想避免任何需要为每个支持的平台重新编译的东西......

(注意:更好的解决方案是在Windows上寻找MYLIBNAME.dll,在Linux上寻找/usr/lib/libMYLIBNAME.so.1,但这种改进是可选的)

.net c# pinvoke portability dllimport

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

使用C#的C++ .dll函数时出现BadImageFormatException错误?

我在使用P/Invoke for C#时遇到了问题.这是我试图从.dll调用的函数(用C++编写):

string
BeatTracker::getName() const
{
    return "Tempo and Beat Tracker";
}
Run Code Online (Sandbox Code Playgroud)

这是我尝试调用此函数的代码:

[DllImport("qm-vamp-plugins.dll",EntryPoint="BeatTracker")]
public static extern string getName();

public QMTempo()
{
   Console.WriteLine(getName());
}
Run Code Online (Sandbox Code Playgroud)

什么似乎是错的?我收到BadImageFormatException.除了IDE给我的模糊名称之外,我怎么能知道未来参考文献中的错误?我顺便使用Visual Studio 2008.

我也在使用(但不确定是否正确)EntryPoint,让它知道我正在使用BeatTracker类中的getName函数(因为还有其他类的getName函数,它们包含在单个.dll文件中)

谢谢!

c# c++ dll pinvoke exception

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

从非托管C++调用C#代码?

在Mono中,您可以将C#中的委托传递给C++函数,该函数将委托作为函数指针接收.这可以在Windows上的C#中完成,例如,您可以编译本机C++非托管库,将其链接到C#项目并获取C++函数以通过C#作为委托传递给它的函数指针调用C#函数吗?

c# c++ pinvoke

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

通过SendMessage将C#中的字符串发送到MFC

我知道如何通过使用LPCTSTR代替PInvoke想要CString的方法,并设置DllImport以使用LPstr转换进行调用.

但是,如何使用SendMessage,LPARAM是IntPtr?

这会有用吗?

    [DllImport("user32.dll", CharSet = CharSet.Ansi)]
    static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, 
        [MarshalAs(UnmanagedType.LPStr)] String lParam);
Run Code Online (Sandbox Code Playgroud)

c# pinvoke mfc

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

在C#应用程序中只能使用C++ DLL的1/4函数

转换C++ DLL以便在C#中使用时遇到一些麻烦.

它正在工作.. DLL中的第一个C++函数就是:int subtractInts(int x, int y)它的典型主体没有问题.所有其他功能都很简单并且已经过测试.但是,我一直在关注一个教程并做一些时髦的东西,将C#中的代码用作C++ DLL(为了便携性).

我的步骤是:

•创建一个C++类,测试并保存它 - 只使用'class.cpp'和'class.h'文件•在Visual Studio 2010中创建一个Win32库项目,在启动时选择DLL,并为我想要的每个函数选择暴露给C#..下面的代码

extern "C" __declspec(dllexport) int addInts(int x, int y)
extern "C" __declspec(dllexport) int multiplyInts(int x, int y)
extern "C" __declspec(dllexport) int subtractInts(int x, int y)
extern "C" __declspec(dllexport) string returnTestString()
Run Code Online (Sandbox Code Playgroud)

非常关键的一点,就是我在DLL中驱逐它们的顺序.

然后作为测试,因为我之前确实遇到过这个问题..我在C#项目中以不同的方式引用它们

   [DllImport("C:\\cppdll\\test1\\testDLL1_medium.dll", CallingConvention = CallingConvention.Cdecl)]

    public static extern int subtractInts(int x, int y);
    public static extern int multiplyints(int x, int y);
    public static extern int addints(int x, int y);
    public static extern string …
Run Code Online (Sandbox Code Playgroud)

c# c++ dll pinvoke dllimport

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

从C#调用Delphi DLL函数

这是Delphi函数头:

function CryptStr(str, Key : pchar; DecryptStr : boolean) : pchar; stdcall;
Run Code Online (Sandbox Code Playgroud)


如何从C#调用此函数.它实际上在一个名为Crypto.dll的DLL中,

请指导
谢谢

.net c# delphi pinvoke

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

编组变量参数 - __arglist或替代

描述我试图解决的问题的最好方法是用代码说话.我在这个论坛上看到了很多__arglist问题,但没有很多有用的答案.我知道应该避免使用_arglist,所以我对其他方法持开放态度

在一个C++模块中,我有类似以下内容

void SomeFunction(LPCWSTR pszFormat, va_args args)
{
    // this function is not exported...
    // it is designed to take a format specifier and a list of variable 
    // arguments and "printf" it into a buffer. This code 
    // allocates buffer and uses _vsnwprintf_s to format the 
    // string. 
    // I really do not have much flexibility to rewrite this function
    // so please steer away from scrutinizing this. it is what is 
    // and I need to call it …
Run Code Online (Sandbox Code Playgroud)

c# c++ pinvoke marshalling variadic-functions

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

如何通过winapi获得显示器的友好名称?

我使用wmi的Win32_DesktopMonitor类.但这不会返回显示器名称.但是当我使用珠穆朗玛峰(Aida64)时,这就向我展示了它.我认为这个应用程序与winapi一起工作.我找到方法GetMonitorInfo,但不明白如何使用它来获取监视器名称.

编辑 原谅我最糟糕的问题.我想用win api知道监视器的朋友名字.我看这个线程url msdn但只在c语言中找到解决方案.

在此输入图像描述

左边的图像显示了我要找的内容.右侧的图像显示从中检索的设备名称GetMonitorInfo.

c# pinvoke winapi

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

在32位中编组结构时的行为与64位运行时中的行为不同

我在PInvoking SetupDiCreateDeviceInfoList时发现了这个.

C++函数签名是:

HDEVINFO SetupDiCreateDeviceInfoList(
  _In_opt_ const GUID *ClassGuid,
  _In_opt_       HWND hwndParent
);
Run Code Online (Sandbox Code Playgroud)

在C#中我定义了GUID这样的结构:

[StructLayout(LayoutKind.Sequential)]
public struct GUID
{
    public uint Data1;
    public ushort Data2;
    public ushort Data3;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
    public byte[] Data4;
}
Run Code Online (Sandbox Code Playgroud)

和这样的功能:

[DllImport("Setupapi.dll")]
public static extern IntPtr SetupDiCreateDeviceInfoList(GUID ClassGuid, IntPtr hwndParent);
Run Code Online (Sandbox Code Playgroud)

由于在C#结构中默认情况下通过副本传递(与类不同),因此该函数签名不应匹配.确实在32位运行时调用该函数时:

GUID classGuid = new GUID();
IntPtr deviceInfoSet = SetupDiCreateDeviceInfoList(classGuid, IntPtr.Zero);
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

SetupDiCreateDeviceInfoList'使堆栈失衡.这很可能是因为托管PInvoke签名与非托管目标签名不匹配.检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配.

但是在64位运行时,上面的代码可以工作.为什么???

当然,如果我通过引用传递结构,则该函数在32位和64位运行时都能正常工作:

[DllImport("Setupapi.dll")]
public static extern IntPtr SetupDiCreateDeviceInfoList(ref GUID ClassGuid, IntPtr hwndParent);

GUID classGuid = new GUID();
IntPtr …
Run Code Online (Sandbox Code Playgroud)

c# pinvoke winapi marshalling data-structures

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

什么是__int32?

我一直试图理解这一点.它是一个名为的结构的参考页面W32TIME_STATUS_INFO.

 typedef struct {
   unsigned __int32 ulSize;
   unsigned __int32 eLeapIndicator;
   unsigned __int32 nStratum;
   signed __int32 nPollInterval;
   unsigned __int32 refidSource;
   unsigned __int64 qwLastSyncTicks;
   signed __int64 toRootDelay;
   unsigned __int64 tpRootDispersion;
   signed __int32 nClockPrecision;
   [string, unique] wchar_t* wszSource;
   signed __int64 toSysPhaseOffset;
   unsigned __int32 ulLcState;
   unsigned __int32 ulTSFlags;
   unsigned __int32 ulClockRate;
   unsigned __int32 ulNetlogonServiceBits;
   unsigned __int32 eLastSyncResult;
   unsigned __int64 tpTimeLastGoodSync;
   unsigned __int32 cEntries;
   [size_is(cEntries)] PW32TIME_ENTRY pEntries;
 } W32TIME_STATUS_INFO,
  *PW32TIME_STATUS_INFO;
Run Code Online (Sandbox Code Playgroud)

我想在C#代码中使用W32TimeQueryStatus 这里的方法,但我不知道如何在C#代码中定义结构,并且该方法将指针作为参数.什么是这些__int32和所有__int64东西?我已经搜索过"双下划线c"等等,但我发现的一切都非常不具体.

我可能不得不handle_t单独询问这个论点,所以现在我只想问一下定义这个结构并将它传递给C#中的PInvoked方法.

c c# c++ pinvoke

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