2016-04-04 10 views
0

Родной класс методов выглядит следующим образомНевозможно загрузитьLibrary32.dll. При вызове из WCF службы

static class NativeMethods 
    {  
    [DllImport("kernel32.dll")] 
    public static extern IntPtr LoadLibrary(string dllToLoad); 

    [DllImport("kernel32.dll")] 
    public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName); 

    [DllImport("kernel32.dll")] 
    public static extern bool FreeLibrary(IntPtr hModule); 
    } 

Загрузка DLL, из локального пути использования app.config

IntPtr pDll = NativeMethods.LoadLibrary(System.Configuration.ConfigurationManager.AppSettings["MyDll"]); 

Эти методы реализованы внутри библиотеки классов и может быть вызвана из приложения форм Windows, а также службы WCF.

Когда мы вызываем вышеуказанный метод из форм Win, он отлично работает. Ниже приведен снимок. enter image description here

Когда мы вызываем вышеуказанный метод из веб-службы WCF, он не может загрузить DLL, но также не вызывает никаких ошибок. Ниже приведен снимок. enter image description here

Мы проверили, есть ли проблема с разрешениями, но это не помогло.

Любые предложения по этому вопросу?

+0

Вы не загружаете 'kernel32.dll'. Вы загружаете 'System.Configuration.ConfigurationManager.AppSettings [" MyDll "]'. Затем выполните некоторые отладки. Начните с чтения документации «LoadLibrary». Это говорит о том, как обрабатываются ошибки. Если возвращается «NULL», это означает, что функция не удалась, и вам нужно вызвать «GetLastError», чтобы узнать, почему. Для p/invoke вам нужно использовать 'SetLastError = true' и' Marshal.GetLastWin32Error() 'или' throw new Win32Exception(); 'вам нужно знать значение' System.Configuration.ConfigurationManager.AppSettings [ MyDll "]' также. Опять же, выполните некоторую отладку. –

+0

System.Configuration.ConfigurationManager.AppSettings ["MyDll"] содержит значение. Я проверил все возможные основные ошибки, но не смог найти ответ. –

+0

Вы не сделали то, что я описал –

ответ

0

Включите LastError, чтобы увидеть, что происходит:

[DllImport("kernel32.dll", SetLastError = true)] 
public static extern IntPtr LoadLibrary(string dllToLoad); 

Если DllHandle равен нулю, вы можете получить последнюю ошибку с

Marshal.GetLastWin32Error().ToString(); 

Этот вызов из faaar далеких глубин моей памяти , В настоящее время я не могу тестировать среду VS, но она должна быть близка к истине.

Я также могу помнить, что вам нужно полное доверие к проекту/настройке в IIS. На 100% не уверен.

+0

Пробовал с предложением выше. К сожалению, он не возвратил никакой ошибки. Мы все еще не в состоянии разобраться в этом вопросе. –

0

Мы создали новый проект с «сервисным приложением WCF», и он отлично работает.

Если тип проекта является «библиотекой услуг WCF», то он не загружает дескриптор dll.

Мы по-прежнему не уверены, почему это поведение проявляется в WCF.

В настоящее время для решения этой проблемы мы создали новое «сервисное приложение WCF».