2012-11-27 52 views
0

可能重复:
Marshal C++ struct array into C#C++ DLL结构到C#

我有一个C++ .dll和我必须用C#使用它,但也存在一些问题。首先这是其中之一。

这里为了使用C++ .dll文件,我必须将C++结构体更改为C#结构体。帮帮我吧。

C++内在张力结构

typedef struct USMC_Devices_st{ 
     DWORD NOD;    // Number of the devices ready to work 

     char **Serial;  // Array of 16 byte ASCII strings 
     char **Version;  // Array of 4 byte ASCII strings 
} USMC_Devices; 

回答

1

结构USMC_DEVICES_st将转化到一个类似于:

using System.Runtime.InteropServices; 

[StructLayout(LayoutKind.Sequential)] 
    struct USMC_DEVICES_st 
    { 
     public UInt32 NOD; 

     public IntPtr serial; 

     public IntPtr Version; 
    } 

访问序列号和版本可以用代码来完成,例如:

IntPtr ser; 

for (var i = 0; 
    (ser = Marshal.ReadIntPtr(um.serial, i)) != IntPtr.Zero; 
    i += Marshal.SizeOf(ser)) 
{ 
    var serial = Marshal.PtrToStringAnsi(ser); 
} 

编辑 - 在这里按照你的意见是访问结构成员的更详细的例子:

static void PrintDevices(USMC_DEVICES_st um) 
     { 
      const int serialSize = 16; 
      const int verSize = 4; 
      int j = 0; 
      for (var i= 0; i < um.NOD; i++, j+= IntPtr.Size) 
      { 
       var ser = Marshal.ReadIntPtr(um.serial, j); 
       var ver = Marshal.ReadIntPtr(um.Version, j); 
       // ensure we check for null pointers - just in case 
       if (ver == IntPtr.Zero || ser == IntPtr.Zero) break; 

       Console.WriteLine("Device {0}, \tSerial number {1}", 
            Marshal.PtrToStringAnsi(ser, serialSize), 
            Marshal.PtrToStringAnsi(ver, verSize)); 
      } 
     } 
+0

感谢您的回答,一个问题要你,我怎么能重新改变无效PrintDevices(USMC_Devices与DVS) { \t为(DWORD i = 0; I AlpK

0

首先,如果你有C++的dll,那么你就可以使用这些DLL到C#项目。按照下面的方法

  1. 打开Visual Studio命令提示符(运行方式管理员联络)
  2. 更改路径该DLL位于(CD C:/用户/ Douments/Visual Studio 2010中/)
  3. 类型的命令

TLBIMP .dll文件/转换:dispret /出:

你会得到导致这样的下面。

Microsoft(R).NET Framework Type Library to Assembly Converter 4.0.30319.1 版权(C)Microsoft Corporation。版权所有。

TLBIMP:类型库导入到C:\用户\ 082043 \桌面\ Interop.CACDirect.dll

C:\用户\ 082043 \桌面>

+0

谢谢你的回答,你能解释清楚请。因为我没有知道有一种简单的方法来使用C++ dll,而不是通过导入到C#代码来更换代码。 – AlpK

+0

TI1000。错误... – AlpK

+0

假设您有MySample.dll(在C++ DLL中)。然后打开Visual Studio命令提示符(以管理员身份运行) 更改dll所在的路径(cd C:/ User/Douments/Visual Studio 2010 /) 键入命令tlbimp MySample.dll/transform:dispret/out:Interop。 MySample.dll,然后你会得到.net CLR DLL文件夹中。那么你可以添加这个互操作DLL到你的项目。消耗所有的C++函数。请让我知道如果你仍然有问题。 –