2011-10-20 14 views
10

Tenemos un método que accede a un recurso compartido de red. Este método funciona bien cuando se llama directamente, pero obtenemos una excepción System.IO.IOException cuando se llama a través de reflecton. Parece que el contexto del usuario no está disponible para el código reflejado (ver el seguimiento de pila a continuación). ¿Hay alguna forma de prevenir esto?Acceso a recursos compartidos de red en llamadas a métodos reflejados

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) 

esto funciona

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

esto no funciona

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); 

Dónde Library.Class.execute se define como

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

y serverPath es un recurso compartido de red que requi rojo el usuario ingresa las credenciales.

----- Actualización 1 -------

Esto parece ser un tanto del medio ambiente - Tengo al menos una máquina de prueba donde todo funciona. Haré algunas pruebas más para determinar qué diferencias importan.

+1

¿Funciona 'LoadFrom' (en lugar de' LoadFile') de forma diferente? –

+2

http://msdn.microsoft.com/en-us/library/b61s44e8.aspx 'LoadFile no carga archivos en el contexto LoadFrom y no resuelve dependencias utilizando la ruta de carga, como lo hace el método LoadFrom' –

+0

Eso es información útil, pero no creo que el problema tenga que ver con 'LoadFrom' vs' LoadFile' ya que en el código actual, Library.dll está en la misma carpeta que la aplicación en ejecución. Además, el problema misteriosamente dejó de suceder hoy. –

Respuesta

0

Esto parece haber sido alguna. tipo de problema climático de platija. No hemos podido reproducir el problema desde que se reinició la máquina de prueba.

0

Es posible que desee probar estos para obtener el directorio actual:

AppDomain.CurrentDomain.BaseDirectory

System.Reflection.Assembly.GetExecutingAssembly() Ubicación

+0

Mi ejemplo no era claro: el directorio inspeccionado no es el directorio actual, sino un recurso compartido de red totalmente calificado, p. \\ machine \ share $ \ dir. –

Cuestiones relacionadas