源码

源码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. Django 开发相关知识 整理

    前言 前端ajax HTTP请求头 ajax上传文件 jsonp跨域 URL 设计 分发 url参数编码 反向生成url 视图 request对象 POST url信息 视图返回值 HttpRespo ...

  2. 使用Fiddler工具在夜神模拟器或手机上抓包

    下载安装Fiddler 地址:https://www.telerik.com/download/fiddler-everywhere Fiddler端设置 Tools>Options>Co ...

  3. Image Processing and Computer Vision_Review:Local Invariant Feature Detectors: A Survey——2007.11

    翻译 局部不变特征探测器:一项调查 摘要 -在本次调查中,我们概述了不变兴趣点探测器,它们如何随着时间的推移而发展,它们如何工作,以及它们各自的优点和缺点.我们首先定义理想局部特征检测器的属性.接下来 ...

  4. pandas库的一些操作

    1.pd.value_count():带入数值可以计算出value有多少的类别 #得到类别的降序 tips['day'].value_counts(sort=True,ascending=True) ...

  5. celery的简单使用

    一   安装celery #首先进行一些简单配置 pip install celery apt-get install erlang apt-get install rabbitmq-server 二 ...

  6. wget最好不要用

    下载速度 很慢 如果大文件 还是windows 迅雷吧

  7. python_推导式

    列表推导式 目的:方便的生成一个列表 格式: v1 = [i for i in 可迭代对象 ] v2 = [i for i in 可迭代对象 if条件]#条件为True菜进行append v1 = [ ...

  8. MyBatis中的OGNL教程

    MyBatis中的OGNL教程 有些人可能不知道MyBatis中使用了OGNL,有些人知道用到了OGNL却不知道在MyBatis中如何使用,本文就是讲如何在MyBatis中使用OGNL. 如果我们搜索 ...

  9. 2018-2019 ICPC, NEERC J. Streets and Avenues in Berhattan(DP)

    题目链接:https://codeforc.es/contest/1070/problem/J 题意:给出一个长度为 k 的字符串,选出 n 个和 m 个不同位置的字符构成两个字符串,使得两个字符串相 ...

  10. ACM-ICPC 2018 焦作赛区网络预赛 K. Transport Ship(DP)

    题目链接:https://nanti.jisuanke.com/t/31720 题意:有n种飞船,每种飞船有(1 << c)- 1  艘,容量为 k[i] ,q 次询问,每次询问选若干艘飞 ...