标签: pinvoke

在c#中编组(将结构传递给非托管类型)

我有一个c ++ dll,它公开了以下函数

long func(struct name * myname)
{
     strcpy(myname->firstname,"rakesh");
     strcpy(myname->lastname,"agarwal");
     return S_OK;
}

struct name
{
    char firstname[100];
    char lastname[100];
}
Run Code Online (Sandbox Code Playgroud)

我想从C#应用程序调用此函数,所以我执行以下操作:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
unsafe public struct name
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst=100)]
    public string firstname;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
    public string lastname;
} ;


[DllImport("C++Dll.dll")]
public unsafe static extern long func(name[] myname);

name[] myname = new name[1];
func(myname);
Run Code Online (Sandbox Code Playgroud)

应用程序构建成功.运行C#application .exe时,该函数func()被成功调用,并且能够在dll中成功填充字段.但是当函数返回到C#应用程序时,变量myname仍然会为结构字段(firstnamelastname)保留空值.

请建议更改,以便我能够填充字段值myname(以便在函数func()完成执行后,变量myname->firstname包含"rakesh"并myname->lastname包含"agarwal".

注意:StringBuilder不能在结构内部使用.

c# pinvoke

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

使用Mono P/Invoke的DllNotFoundException:为什么?

当我尝试从C#调用我的本机库时(使用Mono),我一直在获取DllNotFoundExceptions.我有一个本地库,我正在为其添加绑定.

这就是我所看到的:

$ grep DllImport generated/NativeLibrawLoader.cs | head -n 1
[DllImport("libfspotraw.dll")]



$ cat libfspotraw-sharp.dll.config
<configuration>
  <dllmap dll="libglib-2.0-0.dll" target="libglib-2.0.so.0"/>
  <dllmap dll="libgobject-2.0-0.dll" target="libgobject-2.0.so.0"/>
  <dllmap dll="libgthread-2.0-0.dll" target="libgthread-2.0.so.0"/>
  <dllmap dll="libatk-1.0-0.dll" target="libatk-1.0.so.0"/>
  <dllmap dll="libgtk-win32-2.0-0.dll" target="libgtk-x11-2.0.so.0"/>
  <dllmap dll="libgdk-win32-2.0-0.dll" target="libgdk-x11-2.0.so.0"/>
  <dllmap dll="libgdk_pixbuf-2.0-0.dll" target="libgdk_pixbuf-2.0.so.0"/>
  <dllmap dll="libfspotraw.dll" target="/opt/gnome//lib/f-spot/libfspotraw.so.0"/>
</configuration>
Run Code Online (Sandbox Code Playgroud)

并从strace日志中摘录:

5856  1247991911.215674 open("lib/opt/gnome//lib/f-spot/libfspotraw.so.0.so", O_RDONLY) = -1 ENOENT (No such file or directory)
5856  1247991911.215814 open("lib/opt/gnome//lib/f-spot/libfspotraw.so.0.so.la", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
5856  1247991911.215923 open("./lib/opt/gnome//lib/f-spot/libfspotraw.so.0.so", O_RDONLY) = -1 ENOENT (No such file or directory)
5856  1247991911.215992 open("./lib/opt/gnome//lib/f-spot/libfspotraw.so.0.so.la", …
Run Code Online (Sandbox Code Playgroud)

.net c# mono pinvoke

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

P/Invoke函数重载

我正试图从F#调用一个C库,并遇到了一个奇怪的问题.我有一个包含我所有extern功能的模块.底层C库有两个具有相同名称但不同参数的函数.当然,这在F#模块中是不允许的.

module C =

  open System.Runtime.InteropServices

  [<DllImport("libc", CallingConvention = CallingConvention.Cdecl)>]
  extern int setValue(nativeint source, int value)

  [<DllImport("libc", CallingConvention = CallingConvention.Cdecl)>]
  extern int setValue(nativeint source, string value)

  // the previous function declaration cause the following compile-time error:
  // Duplicate definition of value 'setValue'
Run Code Online (Sandbox Code Playgroud)

有什么特殊的方法可以解决这个问题吗?我无法改变C库.

pinvoke f#

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

处理Silverlight UserControl

我有一个用C++编写的DLL(Player.dll),内部使用Windows GDI.我有一个用Windows Forms编写的应用程序(基本上是一个视频播放器),内部调用API Player.dll来使用p/invoke技术在屏幕上呈现实际图形:

public class ProxyPlayer
{
    [DllImport("Player.dll", CharSet=CharSet.Unicode, EntryPoint="PlayVideo")]
    public static extern void Play(int playerHandle, out TWResult result);

    [DllImport("Player.dll", CharSet=CharSet.Unicode, EntryPoint="PauseVideo")]
    public static extern void Pause(int playerHandle);

    //other methods
}
Run Code Online (Sandbox Code Playgroud)

它正在发挥作用.

但是现在,我想使用Silverlight 4.0编写相同的应用程序.如您所知,大多数Windows GDI都可以HWND在屏幕上渲染图形,这就是我传递playerHandleProxPlayer方法的原因,正如您自己可以看到的那样.Window Forms' UserControl定义了一个名为Handletype 的公共属性,IntPtr它等同于HWND,所以我将它传递给ProxyPlayer方法.它解决了我的问题.但Silverlight UserControl没有任何此类财产.

所以我的问题基本上是,我如何处理我的silverlight控件?因为没有它,我无法调用API Player.dll.但我要从中呼叫APS.我没有任何其他选项,因为DLL是实际的引擎,它确实解释了大量数据然后渲染它们.所以请建议我符合我的要求的解决方案!

注意:假设我的silverlight应用程序将始终在Microsoft Windows上运行.所以我没有问题对Windows GDI进行设置.

c# silverlight pinvoke winforms silverlight-4.0

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

照明USB OpenDMX FTD2XX DMXking

几个快速问题.我有一个DMX王USB照明控制器,我正试图控制.

它基于Open DMX协议(来自Entec),提供ac#class.我已经将设备插入RGB设备,如果我用他们的驱动程序测试USB设备,它连接到COM4,当我将他们的软件切换到发送模式时,我可以设置单独的DMX通道.

使用他们的OpenDMX类,进行一些修改(核心是相同的,我刚刚添加了一些额外的错误检查,我可以找到设备,查询它的信息等.当我打开设备时,我得到一个句柄.我可以写使用FT_Write到那个设备但不管我做什么,实际上没有灯亮起来.

以下是一些相关的代码片段:

public static byte[] buffer;

[DllImport("FTD2XX.dll")]
public static extern FT_STATUS FT_Open(UInt32 uiPort, ref uint ftHandle);
[DllImport("FTD2XX.dll")]
public static extern FT_STATUS FT_Write(uint ftHandle, IntPtr lpBuffer, UInt32 dwBytesToRead, ref UInt32 lpdwBytesWritten);

public static void writeData()
{
    while (!done)
    {
        try
        {
            initOpenDMX();
            status = FT_SetBreakOn(handle);
            status = FT_SetBreakOff(handle);
            bytesWritten = write(handle, buffer, buffer.Length);
            if (bytesWritten == 0)
            {
                break;
            }

            System.Threading.Thread.Sleep(25);
        }
        catch (Exception)
        {
            break;
        }
    }
    Connected = false;
    done = false;
}
Run Code Online (Sandbox Code Playgroud)

所有状态都以FT_Ok的形式返回,bytesWritten返回为512(此USB控制器上的通道数)

我一直在想我错过了将设备设置为传输模式或类似的设备(它只有一个DMX插槽)

public …
Run Code Online (Sandbox Code Playgroud)

c# pinvoke dmx512

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

从C#调用非托管C++库(dll)会产生访问冲突错误(0xc0000005)

很抱歉这个问题很长.我只是想包括我目前对这个问题所知的一切.

我正在使用Visual Studio 2008在C#中创建一个Windows Form程序,该程序调用用C++编写的库.
C++ DLL分析测量数据,该数据由几个样本组成.样本通过function(PDSetWaveSample)传递给库,该函数将struct作为参数.
在设置所有样本之后,使用另一个函数(PDPreProcess)处理测量数据,该函数也将结构作为参数.
C++ DLL将所有测量数据保存在其内部数据结构中,并进行所有处理以获得结果.

在程序开始处理测量数据之前,一切似乎都能正常运行.此时程序崩溃并退出此错误:

程序'XXX.vshost.exe:Managed'已退出,代码为-1073741819(0xc0000005).

我将在本问题的后面添加一些调试信息和C#源代码.

您是否有任何提示如何前进或可能导致这种情况?

我正在运行Windows XP Professional,版本2002 SP 3.

当程序崩溃时,它首先给出此错误消息

未知模块中出现未处理的"System.ExecutionEngineException"类型异常.

以及打破或继续的可能性.我选择休息.

之后我看看大会:

没有为任何调用堆栈帧加载符号.源代码无法显示.

根据调试器,发生错误的位置的程序集如下所示:

7C90E4FA  call        7C90E528 
7C90E4FF  mov         eax,dword ptr [esp] 
7C90E502  mov         esp,ebp 
7C90E504  pop         ebp  
7C90E505  ret              
7C90E506  lea         esp,[esp] 
7C90E50D  lea         ecx,[ecx] 
7C90E510  mov         edx,esp 
7C90E512  sysenter         
==>7C90E514  ret              
7C90E515  lea         esp,[esp] 
7C90E51C  lea         esp,[esp] 
7C90E520  lea         edx,[esp+8] 
7C90E524  int         2Eh  
7C90E526  ret              
7C90E527  nop              
7C90E528  push        ebp  
7C90E529  mov         ebp,esp …
Run Code Online (Sandbox Code Playgroud)

.net c# c++ pinvoke interop

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

使用Delphi DLL和C#中的动态数组

我有一个包含以下类型的Delphi DLL:

type
  TStepModeType = (smSingle, smMultiStep);

  TParameter = record
    Number: Integer;
  end;

  TStruct = record
    ModType: PAnsiChar;
    ModTypeRev: Integer;
    ModTypeID: Integer;
    RecipeName: PAnsiChar;
    RecipeID: Double;
    RootParamCount: Integer;
    StepMode: TStepModeType;
    ParamCount: Integer;
    Parameters: array of TParameter;
  end;
Run Code Online (Sandbox Code Playgroud)

我需要从C#调用这个DLL,传递一个对应于DLL将填充并返回的Delphi类型的ref对象.我在C#代码中定义了这样的结构:

enum stepModeType
{
    Single,
    MultiStep
}

[StructLayout(LayoutKind.Sequential)]
struct parameter
{
    public int Number;
}

[StructLayout(LayoutKind.Sequential)]
struct recipe
{
    public string modType;
    public int modTypeRev;
    public int modTypeId;
    public string recipeName;
    public double recipeId;
    public int rootParamCount;
    public stepModeType stepMode;
    public int paramCount; …
Run Code Online (Sandbox Code Playgroud)

c# delphi pinvoke

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

何时引发Window.SourceInitialized事件

我可以保证在Window.SourceInitialized活动开始之前总是提出Window.Loaded活动吗?我需要HwndSourceWindow.Loaded事件处理程序中进一步处理该对象,我不确定它是否始终可用

wpf pinvoke interop window

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

未找到本机DLL

我有一个程序,使用Tesseract从图像中提取文本.我制作了一个Native C++ DLL,它通过P/Invoke在C#中使用.我的C#应用​​程序是基于控制台的x64,DLL也是64位.

部署到Windows Server后,我收到一个错误,指出DLL(我已经制作的)不存在.错误消息如下.

System.DllNotFoundException:无法加载DLL'TesseractX64.dll':找不到指定的模块.(来自HRESULT的异常:0x8007007E)在Utilities.Finance.PDFParser.PDF.OCRObject.GetUTF8Text(String path,String lang,String imgPath)

我确信DLL存在于该路径中.TesseractX64.DLL与C#应用程序放在同一个文件夹中,因此它应该没有任何问题.

这是我的代码:

[HandleProcessCorruptedStateExceptions]
[DllImport(@"TesseractX64.dll", EntryPoint = "GetUTF8Text", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr GetUTF8Text(string path, string lang, string imgPath);
Run Code Online (Sandbox Code Playgroud)

到目前为止我尝试了什么:

  1. 将DLLImport路径设置为相对路径,例如C:\ DLL\Tesseract.DLL.还是同样的问题.
  2. 安装Visual C++ 2005 - 2012 x86和x64.还是同样的问题.

它在我用于开发程序的Windows 7 x64计算机上运行得非常好.

c# c++ pinvoke

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

用于GetWindowDpiAwarenessContext的C#Pinvoke

我试图在C#应用程序中实现GetWindowDpiAwarenessContext,但没有成功。

relevent头文件是:

windef.h

DECLARE_HANDLE(DPI_AWARENESS_CONTEXT);

typedef enum DPI_AWARENESS {
    DPI_AWARENESS_INVALID           = -1,
    DPI_AWARENESS_UNAWARE           = 0,
    DPI_AWARENESS_SYSTEM_AWARE      = 1,
    DPI_AWARENESS_PER_MONITOR_AWARE = 2
} DPI_AWARENESS;

#define DPI_AWARENESS_CONTEXT_UNAWARE              ((DPI_AWARENESS_CONTEXT)-1)
#define DPI_AWARENESS_CONTEXT_SYSTEM_AWARE         ((DPI_AWARENESS_CONTEXT)-2)
#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE    ((DPI_AWARENESS_CONTEXT)-3)
#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((DPI_AWARENESS_CONTEXT)-4)
Run Code Online (Sandbox Code Playgroud)

WinUser.h

WINUSERAPI
DPI_AWARENESS_CONTEXT
WINAPI
GetWindowDpiAwarenessContext(
    _In_ HWND hwnd);
Run Code Online (Sandbox Code Playgroud)

我在用:

/// <summary>
/// Class for native methods.
/// </summary>
internal static class NativeMethods {

[DllImport("user32.dll")]
internal static extern IntPtr GetWindowDpiAwarenessContext(IntPtr hWnd);

...

            // Dpi awareness context
            IntPtr dpiAwarenessContext = NativeMethods.GetWindowDpiAwarenessContext(process.Handle);
            if (dpiAwarenessContext == (IntPtr)(-1)) {
                sb.AppendLine("  DPI …
Run Code Online (Sandbox Code Playgroud)

c# pinvoke dpi

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

标签 统计

pinvoke ×10

c# ×8

.net ×2

c++ ×2

interop ×2

delphi ×1

dmx512 ×1

dpi ×1

f# ×1

mono ×1

silverlight ×1

silverlight-4.0 ×1

window ×1

winforms ×1

wpf ×1