Такой вопрос: моя либа експортирует следующуйю функцию: Code: DWORD myfunction(PULONG number, PULONG sramber); с тем что 1ый аргумент ето число, 2ой - таблица числ. Терь из C#-повской проги мне нада использовать ету функцию и я вапще без понятия как. Вот типа есть такой код: Code: [DllImport("C:\\Users\\Administrator\\Desktop\\DLL\\DLL.dll", CharSet = CharSet.Auto)] public static extern UInt32 myfunction( out UInt32 number, out UInt32[] sramber, ); Code: UInt32 nr = new UInt32(); UInt32[] tbl = new UInt32[256]; myfunction(out nr, out tbl); после вызова myfunction - application crash. Кароче я без понятия как ето реализовать
Не имеет смысла инициализировать переменные, которые передаются в метод с модификатором out. Передавать нужно скорее всего по ref.
да переменные можно вообще не инициализировать, тут не в том дело. Тут ни с ref ни с out нет никакой возможности вытащить из функции таблицу =( Может еще попробовать загнать ето в IntPtr и от туда конверт в UInt32 / UInt64 но ето мне кажетса уже извращенством =/. Edit: кароче C# ето редкостное де*мо и ни хрена с ним невозможно сделать. Поворот обратно к managed c++ .NET.
бздец, не гони на язык, пиши нормальным русским языком, либо п**уй в школу обратно. по сабжу. DWORD myfunction(PULONG number, PULONG sramber); [DllImport("c:\\temp.dll", SetLastError = true)] public static extern int myfunction(ref int number, ref int sramber)
Как на C# не гнать, ну как скажи? Вот банальный пример когда C# обламываетса: вот длл откомпиленная при помощи GCC, и какого у неё в зависимостях либы от internet explorer? я конешно не знаю C# сразу выбрасывает dll not found exception если попробуеш её заимпортировать. В случае с WinAPI (C/C++) - никакого гемора нет. Я ессно знаю что можно пытатся добавлять все эти зависимости в PATH Environment Variable, etcetera. Может сразу целый program files добавить? А по сабжу, тут ни out ни ref, тут нужно по ходу с IntPtr & GCHandle возиться, но это еще не проверял так как у меня тут утро тока щас. P.S. Вообще откуда у тебя идея меня отправить в школу? xD
судя по твоему знанию русского языка. =\ References смотри, не добавляется ничего само собой. http://img20.imageshack.us/img20/9510/10262009210346.jpg либа собранная на .NET 3.5, 2008 студия.
<offtop> Я из россии сматал 13 лет назад, так что общаюсь как могу уж =/ Вобщем там с длл трабла была в возвращении MessageBox в одном месте в случае ошибки. От туда и сотня разных зависимостей появилась. Но всё равно, ИМХО, реализация DLLImport намного позади стандартных LdrLoadDll && LdrGetProcedureAddress || LoadLibraryEx && GetProcAddress </offtop> Вобщем намутил я следующее: Code: int[] Table = new int[256]; GCHandle handle= GCHandle.Alloc(Table, GCHandleType.Pinned); IntPtr TableHandle= handle.AddrOfPinnedObject(); int Number; int Status = myfunction(TableHandle, out Number); Всё равно еще оно не то, но кажетса что уже ближе. Кароч буду дальше пробовать.
Так C# не для этих дел Я вообще не вижу необходимости импортировать что-то из нативного кода. Из всего что может понадобиться - 99% есть во фреймворке. А нативный код для сишарпа чужеродный, оттого и проблемы у тебя, что ты его вместо си пытаешся использовать.
В C# я уже и так минимум пробую реализовать. Просто нужно сделать ГУИ в чем-то, а поскольку в C# & visual studio 2008 это от силы занимает пол часа вот я и взялся а теперь мучаюсь. Топик исчерпан в принципе.