Привязка к экспортируемому значению с помощью pinvoke - PullRequest
1 голос
/ 26 сентября 2011

У меня есть dll, которая экспортирует не только функции, но и значения.Я заинтересован в dll из R Project (http://www.r -project.org /), он находится в R.dll, который содержит среду выполнения языка r.Объявление в заголовочном файле:

LibExtern SEXP     R_GlobalEnv;

И когда я запускаю dumpbin / exports, я вижу:

    194   C1 00326C08 R_GlobalEnv

Но я не могу найти никаких примеров того, какпривязать такое значение из C # или F #.Может кто-нибудь просветить меня, как я могу получить ссылку на это?

Ответы [ 2 ]

0 голосов
/ 26 сентября 2011

После того, как Ник указал мне в сторону R.NET, я смог посмотреть, как они решили эту проблему.

Сначала они используют API Win32 для загрузки библиотеки (или эквивалент на других платформах):

#if MAC || LINUX
        private static IntPtr LoadLibrary(string filename)
        {
            const int RTLD_LAZY = 0x1;

            if (filename.StartsWith("/"))
            {
                return dlopen(filename, RTLD_LAZY);
            }

            string[] searchPaths = (System.Environment.GetEnvironmentVariable(LibraryPath, EnvironmentVariableTarget.Process) ?? "").Split(Path.PathSeparator);
            foreach (string directory in searchPaths)
            {
                string path = Path.Combine(directory, filename);
                if (File.Exists(path))
                {
                    return dlopen(path, RTLD_LAZY);
                }
            }
            return IntPtr.Zero;
        }

        [DllImport(DynamicLoadingLibraryName)]
        private static extern IntPtr dlopen([MarshalAs(UnmanagedType.LPStr)] string filename, int flag);
#elif WINDOWS
        [DllImport("kernel32.dll")]
        private static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)] string lpFileName);

Затем они используют функцию getProcAddress из kernel32.dll (или эквивалентную на других платформах), чтобы получить фактический адрес переменной:

#if MAC
        [DllImport("libdl.dylib", EntryPoint = "dlsym")]
#elif LINUX
        [DllImport("libdl.so", EntryPoint = "dlsym")]
#elif WINDOWS
        [DllImport("kernel32.dll", EntryPoint = "GetProcAddress")]
#endif
        private static extern IntPtr GetSymbolPointer(IntPtr handle, [MarshalAs(UnmanagedType.LPStr)] string symbol);
0 голосов
/ 26 сентября 2011

Я не знаю, есть ли способ напрямую из C # или F #. Но я думаю, что оболочка C ++ / CLI должна работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...