问题描述
我有一个程序片断Assemblya=Assembly.LoadFrom("BaiduMusic.dll");Typetype=a.GetType("CMusicSearch.BaiduMusic.MainSearch",false);调试运行,a可以得到{BaiduMusic,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null},不过不知道为什么type一直为nullBaiduMusic.dll中类MainSearch的定义如下namespaceCMusicSearch.BaiduMusic{usingCMusicSearch.ISearch;usingCMusicSearch.MusicCommon;usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Text.RegularExpressions;publicclassMainSearch:IMusicSearch,IEncoding{///<summary>///获得TR块中每个TD块信息(歌曲地址、歌曲名、歌手名)///</summary>privatereadonlystringBAIDU_MUSIC_INFO_PATTERN="<tdclass=tdn>.*?</td><tdclass=d><ahref="(?<LinkUrl>.*?)"\s+target=.*?>(?<MusicName>.*?)\s*</a></td><td>(<a.*?>(?<Singer1>.*?)</a>.*?)?(<a.*?>(?<Singer2>.*?)</a>.*?)?(<a.*?>(?<Singer3>.*?)</a>.*?)?(<a.*?>.*?</a>.*?).*?</td>";///<summary>///获得TR块中每个TD块信息(专辑名)///</summary>privatereadonlystringBAIDU_MUSIC_INFO_PATTERN_2="<tdclass=al>(<a.*?>(?<Album>.*?)</a>)?.*?</td>";///<summary>///获得Baidu网页中所有歌曲信息的TR块的正则表达式///</summary>privatereadonlystringBAIDU_TR_PATTERN=@"<tr>s*<tdclass=tdn>.*?</tr>";///<summary>///创建音乐获取URL///</summary>///<paramname="info">音乐搜索信息</param>///<returns>URL</returns>publicstringCreateMusicUrl(SearchMusicInfoinfo){try{stringformat="http://mp3.baidu.com/m?f=ms&rf=idx&tn=baidump3&ct=134217728&lf=&rn=&word={0}&lm={1}";returnstring.Format(format,newobject[]{info.MusicName+CommonSymbol.SYMBOL_SPACE+info.SingerName,info.MusicFormat.ToString("D")});}catch{returnstring.Empty;}}///<summary>///分析返回的DIV快内的歌曲信息///</summary>///<paramname="tr">歌曲tr块的HTML信息</param>///<returns>TR块中歌曲信息列表</returns>privateList<MusicInfo>MusicInfoBuild(stringtr){List<MusicInfo>list=newList<MusicInfo>();tr=tr.Replace("n",string.Empty);GroupCollectiongroups=RegexHelper.GetRegexGroup(tr,this.BAIDU_MUSIC_INFO_PATTERN,RegexOptions.IgnoreCase);if(groups!=null){MusicInfoinfo=newMusicInfo{MusicSource="百度音乐",MusicName=EncodeConverter.HtmlDecode(groups["MusicName"].Value),Album=EncodeConverter.HtmlDecode(RegexHelper.GetRegexGroupItem(tr,this.BAIDU_MUSIC_INFO_PATTERN_2,"Album",RegexOptions.IgnoreCase)),SingerName=groups["Singer1"].Value+""+groups["Singer2"].Value+""+groups["Singer3"].Value};stringstr=groups["LinkUrl"].Value;if(string.IsNullOrEmpty(str)){returnlist;}List<string>musicUrlList=MusicOperator.GetMusicUrlList(str);if((musicUrlList==null)||(musicUrlList.Count==0)){returnnull;}List<string>list3=musicUrlList;foreach(stringstr2inlist3){if(MusicOperator.urlIsValid(str2)){MusicInfoitem=info.Clone()asMusicInfo;item.MusicUrl=str2;item.MusicFormat=MusicOperator.GetMusicFormat(str2);list.Add(item);}}}returnlist;}publicList<MusicInfo>PageAnalysis(stringPageContent){List<MusicInfo>list=newList<MusicInfo>();try{List<string>list2=RegexHelper.GetRegexStringList(PageContent,this.BAIDU_TR_PATTERN,RegexOptions.Singleline|RegexOptions.IgnoreCase);if(list2==null){returnlist;}foreach(stringstrinlist2){list.AddRange(this.MusicInfoBuild(str));}}catch{}returnlist;}///<summary>///指定当前页面编码方式///</summary>///<returns></returns>publicEncodingPageEncode(){returnEncoding.GetEncoding("GB2312");}}}
解决方案
解决方案二:
Typetype=a.GetType("CMusicSearch.BaiduMusic.MainSearch",false);第一个参数末尾多了个空格,Typetype=a.GetType("CMusicSearch.BaiduMusic.MainSearch",false);这样试试看,
解决方案三:
引用1楼stonespace的回复:
Typetype=a.GetType("CMusicSearch.BaiduMusic.MainSearch",false);第一个参数末尾多了个空格,Typetype=a.GetType("CMusicSearch.BaiduMusic.MainSearch",false);这样试试看,
不是这个原因,我之前就已经试过了,还是没用
解决方案四:
Typetype=a.GetType("BaiduMusic.CMusicSearch.BaiduMusic.MainSearch",false);
haveatry
解决方案五:
引用3楼yanbuodiao的回复:
C#codeTypetype=a.GetType("BaiduMusic.CMusicSearch.BaiduMusic.MainSearch",false);haveatry
试过了,还是不行
解决方案六:
你这样还不如直接用Typetype=a.GetType("BaiduMusic.CMusicSearch.BaiduMusic.MainSearch");第2个参数置为false没意义.参见该函数说明:truetothrowanexceptionifthetypeisnotfound;falsetoreturnnull.
解决方案七:
之前我有试过去掉false,不过还是一样,返回null
解决方案八:
那你试这加一个其他类看能不能反射到。
解决方案九:
Debug啊,exception都给你抛出来了,还不知道啥原因,那神仙也没办法了.
解决方案十:
这样试试看:Assemblya=Assembly.LoadFrom("BaiduMusic.dll");Modulemodule=a.GetModule("BaiduMusic.dll");Typetype=module.GetType("CMusicSearch.BaiduMusic.MainSearch",false);
解决方案十一:
如果不行,建议把a里的所有type打印出来,看看都是什么Assemblya=Assembly.LoadFrom("BaiduMusic.dll");Type[]vtClass=a.GetTypes();stringstrText="";foreach(TypetinvtClass){strText+=t.FullName;strText+="rn";}MessageBox.Show(strText);
解决方案十二:
引用10楼stonespace的回复:
如果不行,建议把a里的所有type打印出来,看看都是什么Assemblya=Assembly.LoadFrom("BaiduMusic.dll");Type[]vtClass=a.GetTypes();stringstrText="";foreach(TypetinvtClass){strText+=t.FullName;strText……
Debug到Type[]vtClass=a.GetTypes();这一句,出现下面异常未处理的“System.Reflection.ReflectionTypeLoadException”类型的异常出现在mscorlib.dll中。其他信息:无法加载一个或多个请求的类型。有关更多信息,请检索LoaderExceptions属性。难道是BaiduMusic.dll有问题?还是我配置出问题了?不过Assemblya=Assembly.LoadFrom("BaiduMusic.dll");能得到a为{BaiduMusic,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null},刚接触c#,不是很懂。
解决方案十三:
刚才尝试了一下不用动态添加,在工程里面手动添加引用BaiduMusic.dll,里面的类BaiduMusic是可以正常使用的,说明BaiduMusic.dll是没有问题的。不过动态添加为什么就实现不了呢?求指点啊
解决方案十四:
可能是权限的问题,
解决方案十五:
引用13楼stonespace的回复:
可能是权限的问题,
权限?有没有办法解决的?