我使用Xamarin和Android Studio创建了一个Hello World应用程序.当我进入App Manager时,使用Xamarin构建的应用程序的大小为47 Mb,而使用Android Studio的应用程序的大小为12 Mb.我知道跨平台必须更大,但为什么它这么大?是不是有任何导出设置可以使它变小?
我正在使用 Roslyn 进行代码分析,以验证即使我有以下签名
public void MyMethod(object anObject, MyCustomObject customObject);
Run Code Online (Sandbox Code Playgroud)
我只想接收来自 MyCustomObject 的字符串(第一个)和子元素(第二个)作为参数。我对签名没有权力,无法更改。
这是我评估我的方法所做的事情(这是一个片段)
public void OnMethodInvocation(SyntaxNodeAnalysisContext context)
{
var invocation= context.Node as InvocationExpressionSyntax;
var symbol = context.SemanticModel.GetSymbolInfo(invocation).Symbol as IMethodSymbol;
if (symbol?.Name.ToString()== "MyMethod")
{
var parameterList = invocation.Parameters;
}
Run Code Online (Sandbox Code Playgroud)
截至目前,我可以通过属性参数 (symbol.Parameters) 操作 IParameterSymbol 对象。我没有得到的是以下内容:我已经检查了包含两个参数的结果 IEnumerable,但由于方法签名,它期望接收一个对象和一个 MyCustomObject 实例。我(目前)无法确定第一个参数确实是一个对象而不是字符串(只是一个例子,可能是其他任何东西),并且当我期待 MyCustomObject 的子级时,如果我给它一个空值,我想知道它是一个空参数。
我将感激任何能让我摆脱困境的人!
更新
以下是当我进入 ArgumentSyntax 对象时向我提供的信息类型:
ArgumentSyntax Argument exception
ContainsAnnotations: false
ContainsDiagnostics: false
ContainsDirectives: false
ContainsSkippedText: false
Expression: IdentifierNameSyntax IdentifierName exception
FullSpan: {[550..559)}
HasLeadingTrivia: false
HasStructuredTrivia: false
HasTrailingTrivia: false
IsMissing: false
IsStructuredTrivia: false …
Run Code Online (Sandbox Code Playgroud) 我在Github上有以下开源项目(游戏项目)。我当前正在尝试对使用MSTest框架编写的代码进行单元测试,但是所有测试均返回相同的错误消息:“未处理的异常:System.Security.SecurityException:ECall方法必须打包到系统模块中。” 当我尝试使用NUnit模板进行单元测试时,发生了这种情况。
我浏览了ECall方法后,必须将它们打包 以找到一些答案,但是我没有这样做,因为OP表示他的解决方案在调试器区域内而不在调试器区域内有效。就我而言,就职位而言,OP的问题尚未解决。
之后,我将UnityTestTools框架导入了我的项目。认为这是很容易的,因为它基于NUnit框架。原来没有。测试本身是相当基本的。我有一个称为BaseCharacterClass:MonoBehavior的基类,除其他外,它具有BaseCharacterStats类型的属性。在统计数据中,有一个CharacterHealth类型的对象,它很好地照顾了玩家的健康。
现在,我有以下两个堆栈跟踪,在测试中尝试以下跟踪时似乎看不到。
单元测试(NUNIT)
使用new关键字创建MonoBehavior对象
[Test]
[Category("Mock Character")]
public void Mock_Character_With_No_Health()
{
var mock = new MoqBaseCharacter ();
Assert.NotNull (mock.BaseStats);
Assert.NotNull (mock.BaseStats.Health);
Assert.LessOrEqual (0, mock.BaseStats.Health.CurrentHealth);
}
//This is not the full file
//There "2" classes: 1 for holding tests and that Mock object
public MoqBaseCharacter()
{
this.BaseStats = new BaseCharacterStats ();
this.BaseStats.Health = new CharacterHealth (0);
}
Run Code Online (Sandbox Code Playgroud)堆栈跟踪:
Mock_Character_With_No_Health(0.047s)--- System.NullReferenceException:对象引用未设置为对象的实例---在C:\ Users \ Kevin中的Assets.Scripts.CharactersUtil.CharacterHealth..ctor(Int32 sh)[0x0002f] \ Documents \ AndroidPC_Prototype \ PC_Augmented_Tactics_Demo \ Assets \ …
我目前没有我的问题的例子。我只想了解以下内容: 何时应该在 XAML 中使用一种或两种方式的数据绑定?
提前感谢您抽出时间来回答这个问题!
我想知道在使用Roslyn编译器分析代码时,怎么可能检测到长度(行数).目前,我正在制定一项禁止使用超过10行的lambdas的法律.
看下面的例子,我怎么知道简单的lambda表达式语法只有一行?
// Data source.
int[] scores = { 90, 71, 82, 93, 75, 82 };
// The call to Count forces iteration of the source
int highScoreCount = scores.Where(n => n > 80).Count();
Run Code Online (Sandbox Code Playgroud)
编辑 我想知道的是,我们可以在第一个示例和下面的一个示例中看到我们在lambda表达式中可以看到的行数的差异:
1: private IEnumerable<Book> BooksPublishedBetween1991and1997()
2: {
3: return Books.FindAll(Book => {
4:
5: return Book.Published >= new DateTime(1991, 01, 01) &&
6: Book.Published <= new DateTime(1997, 12, 31);
7:
8: });
9: } //Link to sample : http://www.rvenables.com/2009/03/practical-introduction-to-lambda-expressions/
Run Code Online (Sandbox Code Playgroud)
UPDATE
它在评论中指出我的问题太宽泛了.我会尽可能地尝试简单.在使用Roslyn验证用户在开发客户端软件时应具有的某些开发用途之前,我已经完成了代码分析.我有一个通用的方法来通过使用SyntaxNodeAnalysisContext对象来遍历树代码的节点(不确定它是否真的被称为).我想知道的是,当我在寻找SimpleLambdaExpressionSyntax和ParenthesisedLambdaExpressionSyntax时,是查看lambda表达式内容并确切知道代码编写行数的方法.
我的问题纯粹是理论上的,如果这是一个肯定的答案,我想稍后实施。
是否可以使用 Roslyn 创建代码分析并将其存储在 dll 中,然后在基于 JVM 的项目中使用该 dll 中的内容?我知道 Visual C# 和 Java 语言之间有一些相似之处。但目前只能分析 C# 和 VB(我认为 F# 已暂时搁置),当它们具有确切的功能(例如循环)时,是否可以将代码分析从 C# 应用于 Java。
从这篇文章中,我了解到可以使用 Java 调用 dll。我很高兴知道,当我使用 VB 或 C# 浏览语法树时,它可以对 Java 甚至与 C# 更相似的 Kotlin 执行相同的操作。
我有点复杂的情况.我必须创建分析器/代码修复提供程序,例如仅分配参数但从未使用过,或者从不使用本地变量.
对于参数情况,我要进行方法声明并查看参数列表以获取所有分析器.我正在遍历方法中的赋值表达式,并且我过滤了使用辅助方法分配的参数.
它变得模糊的地方我不知道何时使用局部变量/参数.我已经完成了符号,但他们无法告诉我使用/未使用的变量.我可以尝试通过在字符串中转换方法声明语法上下文来查找方法中提到变量名称的次数,并查找已分配的参数,但这只是一个很糟糕的想法.
我真的被困住了,我会从那些曾经遇到过这种情况的人那里得到一些帮助.
对于可能会问的人,我主要是在寻找分析仪缺失的逻辑.我不知道代码修复提供程序将如何工作.如果您对我能做的事情有所了解,请随意将其包含在您的答案中!截至目前,我认为可以从方法中删除未使用的局部变量,同样可以使用未使用的参数.我现在不确定.
UPDATE
我现在正在尝试使用DataFlow API,但目前它并不适合我.这个帖子最古老的答案给了我一个起点,但实际上并没有起作用.
我想出了自己的方式:
private static bool IsLocalVariableBeingUsed(VariableDeclaratorSyntax variableDeclarator, SyntaxNodeAnalysisContext syntaxNode)
{
var model = syntaxNode.SemanticModel.Compilation.GetSemanticModel(variableDeclarator.SyntaxTree);
var methodBody = variableDeclarator.AncestorsAndSelf(false).OfType<MethodDeclarationSyntax>().First();
var lastMethodNode = methodBody?.ChildNodes().LastOrDefault();
if (lastMethodNode == null)
return false;
var readWrite = syntaxNode.SemanticModel.AnalyzeDataFlow(variableDeclarator, lastMethodNode);
}
Run Code Online (Sandbox Code Playgroud)
但这也行不通.使用NUnit测试时:
var input = @"
class TestClass {
void TestMethod ()
{
int i;
}
}";
Run Code Online (Sandbox Code Playgroud)
当运行时到达readWrite或result(从最旧的答案)时,我收到以下消息:
System.ArgumentOutRangeException Index was out of range Must be non negative and lesser than the size of the collection"
Run Code Online (Sandbox Code Playgroud)
但在此之前,在我的分析器中,当我尝试验证我的节点以确保它不是null并为数据流API创建适当的元素时,没有代码中断(不确定这是否是合适的术语)但是此刻我无法进步.