2011-10-20 73 views
10

我們有一種訪問網絡共享的方法。這種方法直接調用時可以正常工作,但當通過反射調用它時會得到一個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是一種網絡共享requi紅色用戶輸入憑據。

----- 更新1 -------

這似乎是有些環境 - 我至少有一個試驗機在那裏一切正常。我會做更多的測試,以確定哪些差異很重要。

+1

'LoadFrom'(而不是'LoadFile')的行爲有什麼不同嗎? –

+2

http://msdn.microsoft.com/en-us/library/b61s44e8.aspx LoadFile不會將文件加載到LoadFrom上下文中,並且不會使用加載路徑解析依賴關係,因爲LoadFrom方法的作用是' –

+0

有用的信息,但我不認爲這個問題與'LoadFrom'和'LoadFile'有關,因爲在實際的代碼中,Library.dll和執行的應用程序在同一個文件夾中。而且,這個問題今天神祕地停止了。 –

回答

0

這似乎已經有了一些。某種僥倖的環境問題。自測試機重新啓動以來,我們一直無法重現問題。

0

你可能想嘗試這些來獲得當前目錄:

AppDomain.CurrentDomain.BaseDirectory

System.Reflection.Assembly.GetExecutingAssembly()的位置

+0

我的示例並不明確 - 檢查的目錄不是當前目錄,而是完全合格的網絡共享,例如, \\計算機名\共享$ \目錄。 –