2009-05-07 7 views
1

Добрый день,Пользовательские типы в/с DLLImport'ed/P/Invoke'd win32 dll?

я в настоящее время борется со старым .dll, функциональность которого я должен повторно использовать в приложении .NET & я пришел до сих пор импортировать основные/простые функции/методы, которые возвращают BOOL и т.д., но некоторые на самом деле также ожидают (или возвращают) тип, объявленный в DLL.

Как бы я справился с этим? Как мне отобразить/создать этот тип в моей среде .net? Возможно ли это вообще?

Приветствия и спасибо, -Jörg

ответ

1

Под «type» я предполагаю, что вы имеете в виду struct, иначе вам нужно будет выяснить, как сопоставить структуру в памяти вашего типа.

Вам нужно будет создать ту же структуру в своем приложении .NET и пометить ее атрибутом StructLayout (LayoutKind.Sequential является наиболее распространенным). Затем вы сможете передать ссылку на структуру.

Platform Invoke Tutorial on MSDN также весьма полезен.

0

Я понимаю, что вы, как правило, создают структуры в коде .NET, который отражает ожидаемую структуру данных, используя некоторые из [StructLayout] опций (последовательных или явных) - и передать эту структуру по границе PInvoke (т.е. на импортированный API).

0

Я не знаю, если это то, что вы хотите, но я дам ему стрелять!

Я использую dll delphi в одном из своих приложений (ASP.NET), и мне пришлось создать оболочку, я знаю, что для winforms нет необходимости создавать DLL-оболочки, но вам нужно отобразить методы, я 'm вставляя 2 метода из этой DLL и как я их называю:

#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... 
}