2010-03-15 23 views
27

我正在使用EmguCV作爲項目,當我們的程序運行時它需要一些dll,如「cxcore.dll」等(或者它引發運行時異常)。目前,我將這些文件放在輸出文件夾的根目錄下(在Visual Studio文件的屬性中選擇「始終複製」)。C#將所需的DLL放在除輸出根以外的地方

然而,它看起來有點混亂,有大約10個不同的DLL在那裏。有一些地方可以將它移動到輸出文件夾中的子文件夾,它仍然可以找到它。

+0

您是否想從其他位置引用它們(即包含在所有其他相關庫中),還是讓它們位於bin目錄下的子文件夾中?這些**也包含**在項目中,或者是由您的應用程序加載**(Assembly.Load,或P/Invoked)? – GrayWizardx 2010-03-15 07:13:27

+0

@Gray:我想把它們放在我的bin目錄下的子文件夾中。我不直接使用這些dll,但它們被EmguCV項目使用(我相信它們是P/Invoked)。另外,我認爲dll本身是用C語言編寫的。如果dll不存在,我仍然可以編譯,但是我會得到一個運行時異常。 – Aishwar 2010-03-15 07:19:18

回答

-2

你可以使用pre/post生成事件和告訴你輸出文件夾在哪裏的宏將dll複製到你想要的位置。

但是,如果dll與可執行文件不在同一個目錄中,它們將不會被加載。 如果管理它們,則可以使用Assembly.Load方法手動加載它們。 如果他們沒有管理,我不知道你是如何做到的。

+1

請注意事前/事後構建事件,特別是在您使用多個開發人員和/或自動構建的環境中。他們可能是個大問題。 – GrayWizardx 2010-03-15 07:12:00

-3

您可以將它保留在其他地方並仍然將其鏈接。在引用屬性中,將「Copy local」設置爲false並相應地設置路徑。這將工作。如果外部DLLS想要更改版本,則可以將「特定版本」設置爲false以便能夠鏈接到任何版本。

55

迄今爲止令人驚歎的答案。沒有權利;)那麼,

是的,你可以把程序集放在不同的位置。

在相應的應用程序配置(app.config其被複制到your.exe.config)地址:

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="lib" /> 
    </assemblyBinding> 
    </runtime> 

據:

http://msdn.microsoft.com/en-us/library/823z9h8w.aspx

這將使程序考慮私人路徑(文件夾在它自己的文件夾下)組裝 - 就像Web應用程序查找/ bin一樣。

您也可以將它們放入GAC,但應該避免這種情況,除非有其他原因。

這就是說,你真的不需要。如果您在開始菜單中正確安裝應用程序,用戶不會感到困惑;)我從來沒有遇到過這個問題,包括有50多個程序集的項目。用戶simlpy永遠不會看到它們。

+0

@TomTom Svish答案是正確的 – 2010-03-15 07:27:40

+0

至於你的答案。你確定它能用於非託管庫嗎? – 2010-03-15 07:29:28

+0

@TomTom:以上是否在我的'.csproj'文件中?我的項目是一個C#winforms應用程序 - 我找不到'.config'文件。 – Aishwar 2010-03-15 07:40:25

17

要獲得子目錄中的程序集,您可以手動將它們複製到該目錄中,請使用事前或事後生成事件或完全不同的事件。

要加載它們,您可以使用AppDomain.AssemblyResolve Event或(如TomTom所示)<probing> Element。來自MSDN:

以下示例說明如何指定運行時應搜索程序集的應用程序基目錄。

<configuration> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="bin;bin2\subbin;bin3"/> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

的GAC當然是轉儲程序集另一個地方,但不會真正算作一個子目錄...除非您將應用程序安裝在真正不應該安裝的地方:P

+0

@Svish:以上是我的.csproj文件嗎?我的項目是一個C#winforms應用程序 - 我找不到.config文件。 – Aishwar 2010-03-15 07:44:22

+0

@ aip.cd.aish:http://msdn.microsoft.com/en-us/library/4191fzwb(v=VS.90).aspx有一個更完整的示例。如果沒有配置文件,你可以創建一個。根據http://msdn.microsoft.com/en-us/library/ms229689(v=VS.90).aspx它應該被命名爲與.config擴展名的應用程序相同。 – Svish 2010-03-15 08:25:24

+0

該文件也可能被命名爲app.config ...但我不確定。閱讀有關MSDN上的配置文件,你應該弄明白:) – Svish 2010-03-15 08:26:43

相關問題