簡體   English   中英

動態加載的.net程序集在C#中不起作用

[英]dynamically loaded .net assembly does not work in C#

我需要使用MediaPlayer類在Windows應用程序中運行.wav文件,並且需要在運行時加載MediaPlayer類所需的程序集。 我需要使用PresentationFramework.dll,WindowsBase.dll和PresentationCore.dll。 MediaPlayer的對象創建成功,但是嘗試調用MediaPlayer構造函數時失敗。 下面是代碼:

Assembly assembly = Assembly.LoadFrom("PresentationCore.dll");
Type type = assembly.GetType("System.Windows.Media.MediaPlayer");
object instanceOfMyType = Activator.CreateInstance(type);

   type.InvokeMember("MediaPlayer", BindingFlags.DeclaredOnly |
            BindingFlags.Public | BindingFlags.NonPublic |
            BindingFlags.Instance | BindingFlags.SetProperty, null, instanceOfMyType,null);

type.InvokeMember("Open", BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public, null, instanceOfMyType, new object[] { new Uri("C:\\MyMusic\\Song1.wav") });
            type.InvokeMember("Play", BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public, null, instanceOfMyType, null);

但是不起作用..它在此行給出了錯誤

   type.InvokeMember("MediaPlayer", BindingFlags.DeclaredOnly |
            BindingFlags.Public | BindingFlags.NonPublic |
            BindingFlags.Instance | BindingFlags.SetProperty, null, instanceOfMyType,null);

我需要加載所有程序集還是只需要PresentationCOre.dll。 不是用戶我如何運行此。

使用的參考-> http://edu-kinect.com/blog/2014/07/10/reflection-examples-c/

謝謝,

考慮到此順序可以正常工作(您需要在WinXP上使用Windows Media Player> 10或更高版本的操作系統中啟用的媒體功能),而不是像@HansPassant提到的那樣提一個壞主意:

var mediaPlayer = new System.Windows.Media.MediaPlayer();
mediaPlayer.MediaFailed += (o, ev) => 
    Debug.WriteLine("Media Failed: {0}", ev.ErrorException.Message);
mediaPlayer.MediaOpened += (sender, e) => Debug.WriteLine("Media Opened");
//string mediaFilePath = 
Uri uri = new Uri(mediaFilePath, UriKind.RelativeOrAbsolute);
mediaPlayer.Open(uri);
mediaPlayer.Play();

然后像這樣反映上面的序列也應該工作:

Type type = Type.GetType("System.Windows.Media.MediaPlayer, PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");
object instanceMediaPlayer = Activator.CreateInstance(type);
// string mp3FilePath = ...;
var uri = new Uri(mp3FilePath, UriKind.RelativeOrAbsolute);
BindingFlags bfMethodCall = BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public;
type.InvokeMember("Open", bfMethodCall, null, instanceMediaPlayer, new object[] { uri });
type.InvokeMember("Play", bfMethodCall, null, instanceMediaPlayer, null);

此外,我看到您正在使用wav文件作為源。 如果您只需要播放未壓縮的wav文件(不需要其他媒體格式或壓縮的wavs),並且不想控制音量或其他播放方面,則重量更輕的SoundPlayer就足夠了,而無需加載任何額外的引用。

var soundPlayer = new System.Media.SoundPlayer();
soundPlayer.SoundLocation = @"pathTo.wav";
soundPlayer.Load();
soundPlayer.Play();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM