我正在爲現有的C#.NET程序開發一個插件。它的結構方式是將您的自定義.dll文件放入程序根目錄/插件/您的插件名稱/您的插件名稱中.DLLc#類庫項目 - 從相同的文件夾加載DLL?
這一切運行良好,但現在我試圖在我的項目中使用NAudio 。
我已經通過Nuget下載NAudio,並且該部分工作正常,但問題在於它在程序根目錄中查找NAudio.dll,而不是在我的插件的文件夾中。
這使得很難分發我的插件,因爲除了將插件放入「插件」文件夾之外,它將依賴於用戶在其程序根目錄中放置NAudio.dll。
來源: SettingsView.xaml:
<Button HorizontalAlignment="Center"
Margin="0 5"
Width="120"
Command="{Binding SoundTestCommand,
Source={StaticResource SettingsViewModel}}"
Content="Sound Test" />
SettingsViewModel.cs:
using NAudio.Wave;
.
.
.
public void SoundTest()
{
IWavePlayer waveOutDevice;
WaveStream mainOutputStream;
WaveChannel32 inputStream;
waveOutDevice = new WaveOut();
mainOutputStream = new Mp3FileReader(@"E:\1.mp3");
inputStream = new WaveChannel32(mainOutputStream);
inputStream.Volume = 0.2F;
waveOutDevice.Init(mainOutputStream);
waveOutDevice.Play();
}
我如何得到C#尋找n音訊在程序根/插件/我的插件名稱/ NAudio.dll,而不是在Program Root/NAudio.dll中查找它?
我使用VS Express 2013,目標框架是4.5,輸出類型是類庫。
編輯:
我發現2種方法,使這項工作(我不知道這兩種方法的優點和缺點是 - 如果有人知道我將不勝感激附加信息)。
使用NuGet包Costura.Fody。
安裝NuGet包後,我根本就設置的所有其他引用「複製本地」到「假」,然後將「複製本地」爲n音訊爲「真」。
現在,當我編譯時,NAudio.dll被壓縮並添加到我自己的DLL中。
使用AssemblyResolver概述如下。
它沒有工作的時候了,所以這裏是一些額外的信息,可以幫助任何人都面臨着同樣的問題:
我把科裏的代碼,因爲他的貼吧到助手文件夾中。
我的切入點是Plugin.cs,類爲
public class Plugin : IPlugin, INotifyPropertyChanged
在那裏,輸入方法
public void Initialize(IPluginHost pluginHost)
,而是簡單地將PluginResolver.Init(path)
沒有工作。主機程序使用WPF和螺紋,我不得不使用主機程序的調度輔助函數來得到它的工作:
DispatcherHelper.Invoke(() => Resolver.Init(path));
如前所述,我目前不能確定哪種方法來使用,但我很高興我得到它的工作。感謝Corey!
Duplicate:http://stackoverflow.com/a/2991971/1385688 –
@DanielHäfele不是重複的。鏈接的應用程序處理應用程序,但這是特定於不能具有app.config的類庫的。這使得接受的答案不可能用於我的情況。 :(我曾嘗試使用AssemblyResolve事件,但最終因無法找到命名空間而無法編譯 – Bio2hazard
@ Bio2hazard其實Daniel答案中的答案是正確的,並非接受的答案,但答案是建議添加'AssemblyResolve'處理程序,看到我的回答 – Corey