我在C#,。Net 2.0工作。
当我调试我的代码时,一切正常。但是,当我创建exe时,它不是。我添加了一个记录器。这是我的一段代码:
string[] dllFiles = System.IO.Directory.GetFiles(getAddinDllPath(), "Begin_*.dll");
foreach (string dllFile in dllFiles)
{
Logger.Info("ThisMethod numberX");
if (!dllFile.EndsWith("someString.dll", StringComparison.InvariantCultureIgnoreCase))
{
Assembly assembly = Assembly.LoadFile(dllFile);
foreach (Type type in assembly.GetTypes())
{
Logger.Info("ThisMethod numberY");
...............
getAddinDllPath()方法返回:
addinDllPath = Path.Combine(Path.Combine(myDocuments, "Visual Studio 2005"), "Addins") + "\\";
当我调试程序时,文本'ThisMethod number Y'在日志文件中多次出现。
当我创建exe并运行它时,记录器看起来像这样:ThisMethod numberX在结尾处。它永远不会出现在“ThisMethod numberY”中。
为什么?
这是我的记录器:
类记录器 { private static string path = @“C:\ Users \ John \ Documents \ Projects \ MyLogger.txt”;
public static string Path
{
get { return path; }
set { path = value; }
}
public static void Info(string msg)
{
StreamWriter sw = File.AppendText(path);
try
{
string logLine = System.String.Format(
"{0:G}: {1}: {2}", System.DateTime.Now, @"INFO", msg);
sw.WriteLine(logLine);
}
finally
{
sw.Close();
}
}
}
编辑: 如果dllFiles为空,那么一切都很好。但如果文件存在,则会出现问题。
编辑2: 问题在于
Type type in assembly.GetTypes()
有人有想法吗?
答案 0 :(得分:3)
如果"somePath"
与运行目录相关,则您的exe可能正在扫描另一个目录=>找不到.dll文件=> “ThisMethod numberY”未被调用。
如果我的猜测属实,请尝试在somePath
中指定绝对路径。
答案 1 :(得分:2)
确保string dllFile in dllFiles
提供dll&的正确地址。以您在代码中提到的字符串结尾,并确保日志文件在结尾处关闭。你肯定会看到它。
答案 2 :(得分:0)
尝试使用IndexOf >=0
而不是EndsWith("someString.dll"
有时它会烦恼
2.可以是在其他程序集中定义或移动的类型之一/查看msdn GetTypes,其中描述了异常
答案 3 :(得分:0)
我应该用
Assembly assembly = Assembly.LoadFrom(dllFile);
而不是
Assembly assembly = Assembly.LoadFile(dllFile);