【问题标题】:Custom Types in/with DLLImport'ed / P/Invoke'd win32 dll?DLLImport'ed / P/Invoke'd win32 dll 中的自定义类型?
【发布时间】:2009-05-07 10:30:04
【问题描述】:

下午好,

我目前正在与一个旧的 .dll 搏斗,我必须在 .Net 应用程序中重复使用该功能,到目前为止,我导入了返回 bool 等的基本/简单函数/方法,但实际上有些也这样做期望(或返回)在 .dll 中声明的类型。

我将如何处理这个问题?我将如何在我的 .net 环境中映射/创建该类型?这可能吗?

干杯,谢谢, -约尔格

【问题讨论】:

    标签: .net winapi pinvoke types dllimport


    【解决方案1】:

    “类型”是指结构,否则您必须了解如何将内存中的结构映射到您的类型。

    您必须在 .NET 应用程序中创建相同的结构,并用 StructLayout 属性标记它(LayoutKind.Sequential 是最常见的)。然后你应该能够传递对结构的引用。

    Platform Invoke Tutorial on MSDN 也很有帮助。

    【讨论】:

      【解决方案2】:

      我的理解是,您通常会在 .NET 代码中创建一个反映预期数据布局的结构,使用一些 [StructLayout] 选项(顺序或显式) - 并将该结构传递到 PInvoke 边界(即导入的 API)。

      【讨论】:

        【解决方案3】:

        我不知道这是否是你想要的,但我会试一试!

        我在我的一个应用程序 (ASP.NET) 中使用了一个 delphi dll,我必须创建一个包装器,我知道对于 winforms 不需要创建包装器 DLL,但您需要映射方法,我' m 从该 DLL 中粘贴 2 个方法以及如何调用它们:

            #region DllImport
        
            [DllImport("LicenseInterface.dll", CallingConvention = CallingConvention.StdCall,
                       CharSet = CharSet.Auto, EntryPoint = "EncodeString")]
            private static extern int _EncodeString(
                [MarshalAs(UnmanagedType.LPStr)] string secret,
                [MarshalAs(UnmanagedType.LPWStr)] string str,
                [MarshalAs(UnmanagedType.LPWStr)] StringBuilder encodedStr,
                int encodedBufferSize);
        
            [DllImport("LicenseInterface.dll", CallingConvention = CallingConvention.StdCall,
                       CharSet = CharSet.Auto, EntryPoint = "DecodeString")]
            private static extern int _DecodeString(
                [MarshalAs(UnmanagedType.LPStr)] string secret,
                [MarshalAs(UnmanagedType.LPWStr)] string str,
                [MarshalAs(UnmanagedType.LPWStr)] StringBuilder decodedStr,
                int decodedBufferSize);
        
            #endregion
        
        
            public static int EncodeString(string str, ref string encodedStr)
            {
                StringBuilder _encodedString = new StringBuilder(2000);
                int ret = _EncodeString("aYs6aL9b8722XXe43", str, _encodedString, _encodedString.Capacity);
                encodedStr = _encodedString.ToString();
                return ret;
            }
        
            public static int DecodeString(string str, ref string decodedStr)
            {
                StringBuilder _decodedString = new StringBuilder(2000);
                int ret = _DecodeString("aYs6aL9b8722XXe43", str, _decodedString, _decodedString.Capacity);
                decodedStr = _decodedString.ToString();
                return ret;
            }
        
        public License()
        {
           // code...
           License.DecodeKey(moduleKey, ref serial, ref moduleId, ref expirationDate, ref userData);
           // more code...
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-08
          • 2010-11-28
          • 1970-01-01
          • 2021-01-25
          • 1970-01-01
          • 1970-01-01
          • 2015-12-31
          相关资源
          最近更新 更多