2011-12-18 44 views
2

我有一個控制檯應用程序(NGameHost)運行在一個特定的目錄(C:\Program Files\NetworkGame3\api\)。它使用該目錄中可用的文件,並且在自行運行時控制檯應用程序運行良好。它還公開了使用該目錄中的DLL(以及其他文件,如配置文件)的各種方法。我現在有另一個控制檯應用程序(位於別處)試圖調用這些方法並返回結果。我已設置Copy Local: False,以便它在該目錄內執行而不是創建本地版本。但是,我收到錯誤「無法加載文件或程序集......或其依賴項之一,系統找不到指定的文件。」調用DLL文件位於另一個目錄

如何從位於其他目錄的控制檯應用程序調用方法?

+0

你需要使用的完整路徑包含DLL文件的目錄。該程序無法單獨找到它們。默認搜索順序不包括硬盤上的隨機目錄。 – 2011-12-18 14:36:48

+0

當我包含引用時,它在屬性部分中具有正確的完整路徑。我想它會啓動該程序集,因爲它知道路徑,並且我已經告訴它不要使用本地副本。 – XSL 2011-12-18 14:56:02

+1

Hasan的答案就是關於'Copy Local'的問題,它隻影響MSBuild在編譯過程中是否將程序集複製到本地目錄。這與您的應用程序在運行時查找程序集無關。 – 2011-12-18 14:57:43

回答

3

當您設置複製本地=假的你說的那是什麼不要將程序集複製到本地目錄中,在這種情況下,程序集將在運行時查找它的某個位置可用。

How the runtime locates assembly

您的裝配必須是無論是在GAC或探測的地點之一。

+0

是的,您可以使用GAC,但我建議您避免將任何內容放入GAC,除非您絕對必須。根據我對問題中提出的問題的理解,還有其他選擇。你最好通過使用這些。 – 2011-12-18 14:57:08

0

我最近一直在試圖解決一個非常類似的問題,抨擊我的頭撞磚牆。我有一個我想在運行時加載的DLL,它有它自己的依賴關係。我不知道爲什麼它會加載,但是當在加載的程序集中調用一個類的構造函數時,沒有提出任何錯誤,並且執行簡單地停頓,讓你想知道發生了什麼。

原來,加載的程序集的依賴關係是在不同的.NET版本中,並且該代碼上有一個App.Config來啓用混合模式程序集。所以我自然也必須把它帶入我的代碼中,因爲我調用了一個調用另一個.NET版本的程序集的程序集。

直到我將所有依賴項的DLL複製到開發中的應用程序時,錯誤纔出現。現在我可以再次移除它們!這樣做,我得到一個DLL加載程序鎖定警告消息。如果我壓制它或忽略它,我的代碼工作。

在我的情況,那麼,分辨率爲:

<?xml version="1.0"?> 
<configuration> 
    <startup useLegacyV2RuntimeActivationPolicy="true"> 
    <supportedRuntime version="v4.0"/> 
    </startup> 
</configuration> 
相關問題