为什么Assembly.GetType()返回null,求大神指点

majiasi 2011-12-23 12:52:15
我有一个程序片断
Assembly a = Assembly.LoadFrom("BaiduMusic.dll");
Type type = a.GetType("CMusicSearch.BaiduMusic.MainSearch ", false);
调试运行,a可以得到{BaiduMusic, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null},
不过不知道为什么type一直为null

BaiduMusic.dll中类MainSearch 的定义如下

namespace CMusicSearch.BaiduMusic
{
using CMusicSearch.ISearch;
using CMusicSearch.MusicCommon;
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

public class MainSearch : IMusicSearch, IEncoding
{
/// <summary>
/// 获得TR块中每个TD块信息(歌曲地址、歌曲名、歌手名)
/// </summary>
private readonly string BAIDU_MUSIC_INFO_PATTERN = "<td class=tdn>.*?</td><td class=d><a href=\"(?<LinkUrl>.*?)\"\\s+target=.*?>(?<MusicName>.*?)\\s*</a></td><td>(<a.*?>(?<Singer1>.*?)</a>.*?)?(<a.*?>(?<Singer2>.*?)</a>.*?)?(<a.*?>(?<Singer3>.*?)</a>.*?)?(<a.*?>.*?</a>.*?).*?</td>";
/// <summary>
/// 获得TR块中每个TD块信息(专辑名)
/// </summary>
private readonly string BAIDU_MUSIC_INFO_PATTERN_2 = "<td class=al>(<a.*?>(?<Album>.*?)</a>)?.*?</td>";
/// <summary>
/// 获得Baidu网页中所有歌曲信息的TR块的正则表达式
/// </summary>
private readonly string BAIDU_TR_PATTERN = @"<tr>\s*<td class=tdn>.*?</tr>";

/// <summary>
/// 创建音乐获取URL
/// </summary>
/// <param name="info">音乐搜索信息</param>
/// <returns>URL</returns>
public string CreateMusicUrl(SearchMusicInfo info)
{
try
{
string format = "http://mp3.baidu.com/m?f=ms&rf=idx&tn=baidump3&ct=134217728&lf=&rn=&word={0}&lm={1}";
return string.Format(format, new object[] { info.MusicName + CommonSymbol.SYMBOL_SPACE + info.SingerName, info.MusicFormat.ToString("D") });
}
catch
{
return string.Empty;
}
}

/// <summary>
/// 分析返回的DIV快内的歌曲信息
/// </summary>
/// <param name="tr">歌曲tr块的HTML信息</param>
/// <returns>TR块中歌曲信息列表</returns>
private List<MusicInfo> MusicInfoBuild(string tr)
{
List<MusicInfo> list = new List<MusicInfo>();
tr = tr.Replace("\n", string.Empty);
GroupCollection groups = RegexHelper.GetRegexGroup(tr, this.BAIDU_MUSIC_INFO_PATTERN, RegexOptions.IgnoreCase);
if (groups != null)
{
MusicInfo info = new MusicInfo {
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
};
string str = groups["LinkUrl"].Value;
if (string.IsNullOrEmpty(str))
{
return list;
}
List<string> musicUrlList = MusicOperator.GetMusicUrlList(str);
if ((musicUrlList == null) || (musicUrlList.Count == 0))
{
return null;
}
List<string> list3 = musicUrlList;
foreach (string str2 in list3)
{
if (MusicOperator.urlIsValid(str2))
{
MusicInfo item = info.Clone() as MusicInfo;
item.MusicUrl = str2;
item.MusicFormat = MusicOperator.GetMusicFormat(str2);
list.Add(item);
}
}
}
return list;
}

public List<MusicInfo> PageAnalysis(string PageContent)
{
List<MusicInfo> list = new List<MusicInfo>();
try
{
List<string> list2 = RegexHelper.GetRegexStringList(PageContent, this.BAIDU_TR_PATTERN, RegexOptions.Singleline | RegexOptions.IgnoreCase);
if (list2 == null)
{
return list;
}
foreach (string str in list2)
{
list.AddRange(this.MusicInfoBuild(str));
}
}
catch
{
}
return list;
}

/// <summary>
/// 指定当前页面编码方式
/// </summary>
/// <returns></returns>
public Encoding PageEncode()
{
return Encoding.GetEncoding("GB2312");
}
}
}
...全文
573 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
majiasi 2011-12-23
  • 打赏
  • 举报
回复
之前我有试过去掉false,不过还是一样,返回null
godsosome 2011-12-23
  • 打赏
  • 举报
回复
你这样还不如直接用
Type type = a.GetType("BaiduMusic.CMusicSearch.BaiduMusic.MainSearch");
第2个参数置为false没意义.
参见该函数说明:true to throw an exception if the type is not found; false to return null.
majiasi 2011-12-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yanbuodiao 的回复:]

C# code

Type type = a.GetType("BaiduMusic.CMusicSearch.BaiduMusic.MainSearch ", false);


have a try
[/Quote]

试过了,还是不行
烟波钓 2011-12-23
  • 打赏
  • 举报
回复

Type type = a.GetType("BaiduMusic.CMusicSearch.BaiduMusic.MainSearch ", false);

have a try
majiasi 2011-12-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 stonespace 的回复:]

Type type = a.GetType("CMusicSearch.BaiduMusic.MainSearch ", false);

第一个参数末尾多了个空格,

Type type = a.GetType("CMusicSearch.BaiduMusic.MainSearch", false);

这样试试看,
[/Quote]
不是这个原因,我之前就已经试过了,还是没用
majiasi 2011-12-23
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 stonespace 的回复:]

可能是权限的问题,
[/Quote]
权限?有没有办法解决的?
stonespace 2011-12-23
  • 打赏
  • 举报
回复
可能是权限的问题,
majiasi 2011-12-23
  • 打赏
  • 举报
回复
刚才尝试了一下不用动态添加,在工程里面手动添加引用BaiduMusic.dll,里面的类BaiduMusic是可以正常使用的,说明BaiduMusic.dll是没有问题的。不过动态添加为什么就实现不了呢?求指点啊
majiasi 2011-12-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 stonespace 的回复:]

如果不行,建议把a里的所有type打印出来,看看都是什么

Assembly a = Assembly.LoadFrom("BaiduMusic.dll");
Type[] vtClass=a.GetTypes();

string strText="";
foreach(Type t in vtClass)
{
strText+=t.FullName;
strText……
[/Quote]

Debug到Type[] vtClass=a.GetTypes();这一句,出现下面异常

未处理的“System.Reflection.ReflectionTypeLoadException”类型的异常出现在 mscorlib.dll 中。
其他信息: 无法加载一个或多个请求的类型。有关更多信息,请检索 LoaderExceptions 属性。

难道是BaiduMusic.dll有问题?还是我配置出问题了?
不过Assembly a = Assembly.LoadFrom("BaiduMusic.dll");
能得到a为{BaiduMusic, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null},刚接触c#,不是很懂。
stonespace 2011-12-23
  • 打赏
  • 举报
回复
如果不行,建议把a里的所有type打印出来,看看都是什么

Assembly a = Assembly.LoadFrom("BaiduMusic.dll");
Type[] vtClass=a.GetTypes();

string strText="";
foreach(Type t in vtClass)
{
strText+=t.FullName;
strText+="\r\n";
}

MessageBox.Show(strText);
stonespace 2011-12-23
  • 打赏
  • 举报
回复
这样试试看:

Assembly a = Assembly.LoadFrom("BaiduMusic.dll");
Module module = a.GetModule("BaiduMusic.dll");
Type type = module.GetType("CMusicSearch.BaiduMusic.MainSearch ", false);
godsosome 2011-12-23
  • 打赏
  • 举报
回复
Debug啊,exception都给你抛出来了,还不知道啥原因,那神仙也没办法了.
stonespace 2011-12-23
  • 打赏
  • 举报
回复
Type type = a.GetType("CMusicSearch.BaiduMusic.MainSearch ", false);

第一个参数末尾多了个空格,

Type type = a.GetType("CMusicSearch.BaiduMusic.MainSearch", false);

这样试试看,
wdzr_826 2011-12-23
  • 打赏
  • 举报
回复
那你试这加一个其他类看能不能反射到。

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧