У меня есть dll vb6 COM с классом LoginClass и функцией LoginUser в нем. Мне нужно, чтобы динамически вызывал эту vb6 COM dll с C#. Я пытаюсь использовать код C# для доступа к нему динамически, но GetProcAddress возвращает 0 даже после указателя, возвращаемого LoadLibrary.C# GetProcAddress Возвращает 0 при вызове функции dll vb6 COM d12
static class NativeMethods
{
[DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern IntPtr LoadLibrary(string dllToLoad);
[DllImport("kernel32", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
[DllImport("kernel32")]
public static extern bool FreeLibrary(IntPtr hModule);
}
class COMCommands
{
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate string Login(string userName, string Password, bool Result);
public string CallLoginCommand(string UserName, string Password, ref bool Result)
{
IntPtr pDll = NativeMethods.LoadLibrary(@"D:\MyCOMdll.dll");
IntPtr pAddressOfFunctionToCall = NativeMethods.GetProcAddress(pDll, "LoginUser");
Login CallLogin = (Login)Marshal.GetDelegateForFunctionPointer(pAddressOfFunctionToCall, typeof(Login));
string theResult = CallLogin(UserName, Password, Result);
bool result = NativeMethods.FreeLibrary(pDll);
return theResult;
}
}
Вы ** не можете ** вызывать библиотеку VB6 как это, она ** не экспортирует никакой функции «C style» **, которую вы можете импортировать. Взгляните на [эту ссылку] (http://stackoverflow.com/questions/2257883/using-a-vb6-class-in-c-sharp). –
Означает ли это, что dll vb6 COM нельзя динамически вызывать из C#. –
Нет, вы всегда можете ** называть их через COM-интерфейс **, вы просто ** не можете DllImport ** (он более или менее эквивалентен LoadLibrary + GetProcAddress) экспортированной функции (фактически потому, что ** нет стиля C экспортированная функция **). –