源码

源码1

namespace Hearthbuddy.Windows
{
    // Token: 0x02000041 RID: 65
    public class MainWindow : Window, IComponentConnector

// Hearthbuddy.Windows.MainWindow
// Token: 0x0600021B RID: 539 RVA: 0x0008A250 File Offset: 0x00088450
private static void smethod_1(string string_0, string string_1, IEnumerable<string> ienumerable_0)
{
try
{
using (CSharpCodeProvider csharpCodeProvider = new CSharpCodeProvider())
{
CompilerParameters compilerParameters = new CompilerParameters
{
GenerateExecutable = false,
GenerateInMemory = true
};
foreach (string value in ienumerable_0)
{
compilerParameters.ReferencedAssemblies.Add(value);
}
CompilerResults compilerResults = csharpCodeProvider.CompileAssemblyFromSource(compilerParameters, new string[]
{
string_1
});
if (compilerResults.Errors.Count > )
{
StringBuilder stringBuilder = new StringBuilder();
foreach (object obj in compilerResults.Errors)
{
CompilerError compilerError = (CompilerError)obj;
stringBuilder.AppendFormat(string.Concat(new object[]
{
"Line number ",
compilerError.Line,
", Error Number: ",
compilerError.ErrorNumber,
", '",
compilerError.ErrorText,
";"
}), Array.Empty<object>());
stringBuilder.AppendLine();
}
throw new Exception(stringBuilder.ToString());
}
Type type = compilerResults.CompiledAssembly.GetType(string_0);
object obj2 = Activator.CreateInstance(type);
object obj3 = type.GetMethod("Execute").Invoke(obj2, new object[]);
if (obj3 != null)
{
MainWindow.ilog_0.Info(obj3);
}
}
}
catch (Exception exception)
{
MainWindow.ilog_0.Error("[Ui] An exception occurred:", exception);
}
}

源码2

Hearthbuddy\Triton\Common\CodeCompiler.cs

public CompilerResults Compile()
{
this.method_2();
this.method_3();
if (this.SourceFilePaths.Count != )
{
CompilerResults result;
using (CSharpCodeProvider csharpCodeProvider = new CSharpCodeProvider(new Dictionary<string, string>
{
{
"CompilerVersion",
string.Format(CultureInfo.InvariantCulture.NumberFormat, "v{0:N1}", this.CompilerVersion)
}
}))
{
csharpCodeProvider.Supports(GeneratorSupport.Resources);
if (this.resourceWriter_0 != null)
{
this.resourceWriter_0.Close();
this.resourceWriter_0.Dispose();
this.resourceWriter_0 = null;
}
foreach (Stream stream in this.list_2)
{
try
{
stream.Close();
stream.Dispose();
}
catch
{
}
}
this.list_2.Clear();
CompilerResults compilerResults = csharpCodeProvider.CompileAssemblyFromFile(this.Options, this.SourceFilePaths.ToArray());
if (!compilerResults.Errors.HasErrors)
{
this.CompiledAssembly = compilerResults.CompiledAssembly;
}
compilerResults.TempFiles.Delete();
foreach (string path in this.list_1)
{
try
{
File.Delete(path);
}
catch
{
}
}
this.list_1.Clear();
result = compilerResults;
}
return result;
}
if (this.resourceWriter_0 != null)
{
this.resourceWriter_0.Close();
this.resourceWriter_0.Dispose();
this.resourceWriter_0 = null;
}
foreach (Stream stream2 in this.list_2)
{
try
{
stream2.Close();
stream2.Dispose();
}
catch
{
}
}
this.list_2.Clear();
foreach (string path2 in this.list_1)
{
try
{
File.Delete(path2);
}
catch
{
}
}
this.list_1.Clear();
return null;
}

在CodeCompiler的构造函数中,调用了下面的方法。在编译之前,先删除CompiledAssemblies文件夹下已经编译好的文件。

// Triton.Common.CodeCompiler
// Token: 0x0600155E RID: 5470 RVA: 0x000CE98C File Offset: 0x000CCB8C
private static void smethod_1()
{
string path = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "CompiledAssemblies");
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
foreach (string path2 in Directory.GetFiles(path, "*.*", SearchOption.AllDirectories))
{
try
{
File.Delete(path2);
}
catch (Exception)
{
}
}
foreach (string path3 in Directory.GetDirectories(path))
{
try
{
Directory.Delete(path3);
}
catch (Exception)
{
}
}
if (!Directory.Exists(CodeCompiler.CompiledAssemblyPath))
{
Directory.CreateDirectory(CodeCompiler.CompiledAssemblyPath);
}
}

问题

如下代码无法通过编译

using System;
using System.Linq;
using System.Xml.Linq; namespace HREngine.Bots
{
public class XmlHelper
{
private static XElement _cardDatabase; public static string GetCardNameByCardId(string filePath, string cardId)
{
if (_cardDatabase == null)
{
_cardDatabase = XElement.Load(filePath);
} var tempTargetElement = _cardDatabase.Elements("Entity")
.FirstOrDefault(x => x.Attribute("CardID")?.Value == cardId);
var tempTargetElement2 = tempTargetElement?.Elements("Tag")
.FirstOrDefault(x => x.Attribute("name")?.Value == "CARDNAME");
XElement targetElement = tempTargetElement2?.Element("enUS");
if (targetElement == null)
{
throw new Exception(string.Format("Can not find card by Id {0}", cardId));
} return targetElement.Value;
}
}
}

"The type or namespace name 'Linq' does not exist in the namespace 'System' (are you missing an assembly reference?)"

The type or namespace name 'Xml' does not exist in the namespace 'System' (are you missing an assembly reference?)

The type or namespace name 'XElement' could not be found (are you missing a using directive or an assembly reference?)

2019-08-04 18:06:56,506 [7] ERROR AssemblyLoader`1 (null) - [Reload] An exception occurred.
System.IO.DirectoryNotFoundException: Could not find a part of the path 'C:\Users\clu\Desktop\GitHub\HearthbuddyRelease\bin\roslyn\csc.exe'.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
at Microsoft.CodeDom.Providers.DotNetCompilerPlatform.Compiler.get_CompilerName()
at Microsoft.CodeDom.Providers.DotNetCompilerPlatform.Compiler.FromFileBatch(CompilerParameters options, String[] fileNames)
at Microsoft.CodeDom.Providers.DotNetCompilerPlatform.Compiler.CompileAssemblyFromFileBatch(CompilerParameters options, String[] fileNames)
at System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromFile(CompilerParameters options, String[] fileNames)
at Triton.Common.CodeCompiler.Compile()
at Triton.Common.AssemblyLoader`1.Reload(String reason)

Reload的逻辑

// Triton.Common.AssemblyLoader<T>
// Token: 0x06001556 RID: 5462 RVA: 0x000CE6C0 File Offset: 0x000CC8C0
public void Reload(string reason)
{
this.ilog_0.Debug(string.Format("Reloading AssemblyLoader<{0}> - {1}", typeof(T), reason));
this.Instances = new List<T>();
if (!Directory.Exists(this.string_0))
{
this.ilog_0.Error(string.Format("Could not Reload assemblies because the path \"{0}\" does not exist.", this.string_0));
return;
}
foreach (string path in Directory.GetDirectories(this.string_0))
{
try
{
CodeCompiler codeCompiler = new CodeCompiler(path);
CompilerResults compilerResults = codeCompiler.Compile();
if (compilerResults != null)
{
if (compilerResults.Errors.HasErrors)
{
foreach (object obj in compilerResults.Errors)
{
this.ilog_0.Error("Compiler Error: " + obj.ToString());
}
}
else
{
this.Instances.AddRange(new TypeLoader<T>(codeCompiler.CompiledAssembly, null));
}
}
}
catch (Exception ex)
{
if (ex is ReflectionTypeLoadException)
{
foreach (Exception exception in (ex as ReflectionTypeLoadException).LoaderExceptions)
{
this.ilog_0.Error("[Reload] An exception occurred.", exception);
}
}
else
{
this.ilog_0.Error("[Reload] An exception occurred.", ex);
}
}
}
using (List<T>.Enumerator enumerator2 = new TypeLoader<T>(null, null).GetEnumerator())
{
while (enumerator2.MoveNext())
{
AssemblyLoader<T>.Class229 @class = new AssemblyLoader<T>.Class229();
@class.gparam_0 = enumerator2.Current;
if (!this.Instances.Any(new Func<T, bool>(@class.method_0)))
{
this.Instances.Add(@class.gparam_0);
}
}
}
if (this.eventHandler_0 != null)
{
this.eventHandler_0(this, null);
}
}

string_0的赋值

// Token: 0x06001551 RID: 5457 RVA: 0x000CE580 File Offset: 0x000CC780
public AssemblyLoader(string directory, bool detectFileChanges)
{
this.Instances = new List<T>();
this.string_0 = directory;
this.bool_0 = detectFileChanges;
if (this.bool_0)
{
this.fileSystemWatcher_0.Path = directory;
this.fileSystemWatcher_0.Filter = "*.cs";
this.fileSystemWatcher_0.IncludeSubdirectories = true;
this.fileSystemWatcher_0.EnableRaisingEvents = true;
this.fileSystemWatcher_0.Changed += this.method_0;
this.fileSystemWatcher_0.Created += this.method_1;
this.fileSystemWatcher_0.Deleted += this.method_2;
}
this.Reload("Initializing");
}

method2在读取文件路径

// Triton.Common.CodeCompiler
// Token: 0x06001573 RID: 5491 RVA: 0x000CF470 File Offset: 0x000CD670
private void method_2()
{
if (this.FileStructure == CodeCompiler.FileStructureType.Folder)
{
foreach (string string_ in Directory.GetFiles(this.SourcePath, "*.resx", SearchOption.AllDirectories))
{
this.method_1(string_);
}
bool flag = false;
foreach (string string_2 in Directory.GetFiles(this.SourcePath, "*.baml", SearchOption.AllDirectories))
{
flag = true;
this.method_0(string_2);
}
foreach (string text in Directory.GetFiles(this.SourcePath, "*.cs", SearchOption.AllDirectories))
{
if (text.ToLowerInvariant().Contains(".g.cs"))
{
if (flag)
{
this.SourceFilePaths.Add(text);
}
}
else if (text.ToLowerInvariant().Contains(".xaml.cs"))
{
if (flag)
{
this.SourceFilePaths.Add(text);
}
}
else
{
this.SourceFilePaths.Add(text);
}
}
return;
}
this.SourceFilePaths.Add(this.SourcePath);
}

HearthBuddy CSharpCodeProvider 如何编译cs文件的更多相关文章

  1. 用csc命令行手动编译cs文件

    一般初学c#时,用记事本写代码,然后用命令行执行csc命令行可以编译cs文件.方法有两种 1:配置环境,一劳永逸 一般来说在C:\Windows\Microsoft.NET\Framework\v4. ...

  2. C# 使用命令行编译单个CS文件

    编译单个CS文件. 1.编译   File.cs   以产生   File.exe:       csc   File.cs     2.编译   File.cs   以产生   File.dll:  ...

  3. 九、将cs文件快速的转换成可执行文件和响应文件(配置编译开关的文件)

    1.将包含多个类型的源代码文件转换为可以部署的文件.有如下Program.cs的文件,代码如下: public sealed class Program { public static void Ma ...

  4. C#.NET常见问题(FAQ)-如何将cs文件编译成dll文件 exe文件 如何调用dll文件

    比如我要把TestDLL.cs文件编译成dll文件,则在命令提示符下,输入下面的命令,生成的文件为TestDLL.dll csc /target:library TestDLL.cs 注意前提是你安装 ...

  5. VS.NET2013发布网站的时候去掉.cs文件(预编译)(转)

      在要发布的网站上右键,选择"发布网站".   在发布窗口中,会让你选择一个发布配置文件,没有的话点击下拉菜单在里面选择新建一个. NEXT.   好,现在发布一下网站.发布出来 ...

  6. C#.NET如何将cs文件编译成dll文件 exe文件 如何调用dll文件

    比如我要把TestDLL.cs文件编译成dll文件,则在命令提示符下,输入下面的命令,生成的文件为TestDLL.dll csc /target:library TestDLL.cs 注意前提是你安装 ...

  7. 如何把.cs文件编译成DLL文件

    开始--程序--Microsoft Visual Studio.NET 2013--Visual Studio.NET工具,点击其中的"VS2013 开发人员命令提示",就会进入M ...

  8. C# 调用WebService的3种方式 :直接调用、根据wsdl生成webservice的.cs文件及生成dll调用、动态调用

    1.直接调用 已知webservice路径,则可以直接 添加服务引用--高级--添加web引用 直接输入webservice URL.这个比较常见也很简单 即有完整的webservice文件目录如下图 ...

  9. 安利一个MVC的好东西,RazorGenerator.MsBuild,可以自动编译cshtml文件

    在传统的asp.net webForm 开发里,在发布时,如果选择预编译,就会自动将所有的aspx 文件编译,在发布后的目录里,就看不到aspx的源代码了,同时因为是预编译的,所以每个页面打开速度都挺 ...

随机推荐

  1. VUE实现简单的全选/全不选

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  2. Subplots

    数据读取: Subplotting 先展示下我们在画一张图时的步骤 生成一个matplotlib Figure对象 生成一个matplotlib AxesSubplot 对象,然后将其赋值给Figur ...

  3. 如何提高后台服务应用问题的排查效率?日志 VS 远程调试

    转眼间,距离Jerry最近一篇文章推送已经过去了一个多月的时间了. 公众号更新的频率降低,不是因为Jerry偷懒,而是由于从春节过后,我所在的SAP成都研究院数字创新空间整个团队,一直在忙一个5月份需 ...

  4. mysql 获取表字段说明SQL

    SELECTTABLE_NAME as '表名', column_name AS '列名', data_type AS '数据类型', character_maximum_length AS '字符长 ...

  5. Spring Data JPA 大纲归纳

    第一天: springdatajpa day1:orm思想和hibernate以及jpa的概述和jpa的基本操作 day2:springdatajpa的运行原理以及基本操作 day3:多表操作,复杂查 ...

  6. python 获取导入模块的文件路径

    接触到项目上有人写好的模块进行了导入,想查看模块的具体内容是如何实现的,需要找到模块的源文件. 本博文介绍两种查找模块文件路径方法: 方法一: #!/usr/bin/python # -*- codi ...

  7. tempfile:临时文件系统对象

    介绍 想要安全的创建名字唯一的临时文件,以防止被试图破坏应用或窃取数据的人猜出,这很有难度.tempfile模块提供了多个函数来安全创建临时文件系统资源.TemporaryFile函数打开并返回一个未 ...

  8. 关于JPype报FileNotFoundError: [Errno 2] No such file or directory: '/usr/lib/jvm'错误的解决

    部署到线上的项目正常运行一年,今天早上突然报FileNotFoundError: [Errno 2] No such file or directory: '/usr/lib/jvm'错误. JPyp ...

  9. sql 拼接字符串单条拆分多条

    SELECT * FROM ( SELECT A.WS_ID , B.NEXT_OPERATOR FROM ( SELECT WS_ID , [NEXT_OPERATOR] = CONVERT(XML ...

  10. Map的使用及遍历方式

    Java中Map遍历的四种方式 如果同时需要key和value推荐使用entrySet(第一种): 如果只是获取key,或者value,推荐使用keySet或者values方式(第二种): 如果需要在 ...