Доступ к сетевым ресурсам в отраженных вызовах методов - PullRequest
10 голосов
/ 20 октября 2011

У нас есть метод доступа к общему сетевому ресурсу. Этот метод отлично работает, когда вызывается напрямую, но мы получаем исключение System.IO.IOException, когда он вызывается с помощью рефлекона. Похоже, что пользовательский контекст не доступен для отраженного кода (см. Трассировку стека ниже). Есть ли способ предотвратить это?

System.Reflection.TargetInvocationException: Exception has been thrown by 
the target of an invocation. ---> System.IO.IOException: Logon failure:
unknown user name or bad password.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.InternalGetFileDirectoryNames(String path, 
String userPathOriginal, String searchPattern, Boolean includeFiles,
Boolean includeDirs, SearchOption searchOption)
at System.IO.Directory.GetDirectories(String path, String searchPattern, 
SearchOption searchOption)

это работает

   Library.Class obj =new Library.Class();
   obj.Execute(serverPath);

это не работает

    Assembly assembly = Assembly.LoadFile(@"pathTo\Library.dll");
    Type type = assembly.GetType("Library.Class");
    MethodInfo executeMethod = type.GetMethod("Execute");
    object classInstance = Activator.CreateInstance(type, null);
    object[] parameterArray = new object[] { serverPath};
    executeMethod.Invoke(classInstance, parameterArray);

Где Library.Class.execute определяется как

public void Execute(string serverPath){
   string[] directories = Directory.GetDirectories(serverPath, 
                          "1.*", SearchOption.TopDirectoryOnly);
    foreach (var directory in directories) {
        Console.WriteLine(directory);    
    }
}

и serverPath - это общий сетевой ресурс, который требовал от пользователя ввода учетных данных.

----- Обновление 1 -------

Кажется, это несколько экологично - у меня есть хотя бы одна тестовая машина, на которой все работает. Я проведу еще несколько тестов, чтобы определить, какие различия имеют значение.

Ответы [ 2 ]

0 голосов
/ 22 октября 2011

Похоже, это была какая-то случайная экологическая проблема. Мы не смогли воспроизвести проблему с момента перезапуска тестовой машины.

0 голосов
/ 21 октября 2011

Вы можете попробовать это, чтобы получить текущий каталог:

AppDomain.CurrentDomain.BaseDirectory

System.Reflection.Assembly.GetExecutingAssembly (). Местоположение

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