Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态CRM反射_C#_Reflection_Dynamics Crm_Crm_Dynamics Crm Online - Fatal编程技术网

C# 动态CRM反射

C# 动态CRM反射,c#,reflection,dynamics-crm,crm,dynamics-crm-online,C#,Reflection,Dynamics Crm,Crm,Dynamics Crm Online,我希望在Dynamics CRM在线插件中使用反射。我知道CRM Online使用的是中等信任环境,不允许反射。但是,我也理解,允许在同一程序集中进行反射,因为它在同一程序集中,可以自动信任自己 请注意,我的CRM插件解决方案包含多个项目,因此在CRM之外包含多个DLL,但我使用ILMerge将这些项目合并为一个程序集,以便部署到CRM。因此,这个程序集包含多个不同的名称空间,但是出于反射权限的目的,这只是一个具有不同名称空间的程序集-这没有什么不寻常的,并且不应该导致反射问题-AFAIK 在我

我希望在Dynamics CRM在线插件中使用反射。我知道CRM Online使用的是中等信任环境,不允许反射。但是,我也理解,允许在同一程序集中进行反射,因为它在同一程序集中,可以自动信任自己

请注意,我的CRM插件解决方案包含多个项目,因此在CRM之外包含多个DLL,但我使用ILMerge将这些项目合并为一个程序集,以便部署到CRM。因此,这个程序集包含多个不同的名称空间,但是出于反射权限的目的,这只是一个具有不同名称空间的程序集-这没有什么不寻常的,并且不应该导致反射问题-AFAIK

在我的本地测试环境中,我曾经设置一个部分信任环境并测试我的反射。在此测试环境中,程序集不会与ILMerge合并,而是使用
InternalsVisibleTo
属性,我能够成功地进行反射。
InternalsVisibleTo
属性保留在程序集中,它是ILMerge的结果,但实际上不是必需的,因为ILMerge只创建一个程序集

这是CRM给我的错误:

Attempt by method 'Namespace1.QueryProvider.Evaluator+SubtreeEvaluator.GetValue(System.Linq.Expressions.MemberExpression)' to access field 'Namespace2.Entities.CreditTransaction+<>c__DisplayClass1_0.id' failed.: at System.Reflection.RtFieldInfo.PerformVisibilityCheckOnField(IntPtr field, Object target, RuntimeType declaringType, FieldAttributes attr, UInt32 invocationFlags)
at System.Reflection.RtFieldInfo.InternalGetValue(Object obj, StackCrawlMark& stackMark)
at System.Reflection.RtFieldInfo.GetValue(Object obj)
at Namespace1.QueryProvider.Evaluator.SubtreeEvaluator.GetValue(MemberExpression exp)
字段Namespace2.Entities.CreditTransaction+c__DisplayClass1_0.id通过以下表达式传递给上述方法,它引用了id变量,从我的阅读中,编译器将其定义为内部变量,作为ClosureExpression的一部分:

Guid id = newTrans.Account.Id;
List<CreditTransaction> transactions = context.CreditTransactionSet.Where(ct => ct.Account.Id == id).OrderByDescending(ct => ct.CreatedOn).ToList();
Guid id=newTrans.Account.id;
List transactions=context.CreditTransactionSet.Where(ct=>ct.Account.Id==Id).OrderByDescending(ct=>ct.CreatedOn).ToList();

如果我的工作理论是正确的,即使在信任的环境下,在同一个程序集中也可以进行反射,那么有人能为我解释一下为什么它不起作用(即我的知识差距),或者指导我找到一个解决方案吗?

您是否明确排除了ILMerge作为可能的错误源的可能性?也就是说,在您的有限信任测试环境中,您是否也使用ILMerge-d程序集(而不是
[InternalsVisibleTo]
)运行测试?@stakx,我没有这样做不,立即这是不可能的,因为我无法在我的ILMerge'd程序集上运行测试,因为我会因为重复的声明而出错-在解决方案中的项目生成的单独dll中,以及在ILMerge'd程序集中该dll的副本中。但是,在ILMerge的上下文中必须忽略
InternalsVisibleTo
属性,因为没有单独的程序集来指定内部构件应可见-所有内部构件都包含在同一个程序集中。因此,我不确定这有什么关系?我想理论上你是对的。在实践中?我不知道。但您是说ILMerge的程序集出现错误。然而,你期望它能完美地工作。如果我是你,我会先删除已知的错误,然后再追踪一个难以捕捉的bug。可能是这些事情是相关的话虽如此,我想值得记住的是ILMerge是一个在.NET4之前编写的旧工具。AFAIK它不再更新,也不再维护。还可以看看它的创建者写了些什么。嗨@stakx,我已经尽我所能测试了ILX插件程序集。我设置了一个新的测试项目,将其链接到ILMerged程序集,并通过插件调用的相同代码运行代码-这需要测试程序集的内部代码由我在上面的问题中引用的相同GetValue方法处理。我在PartialTrust环境中运行了测试,测试程序集中没有
InternalsVisibleTo
属性,但是一切正常。
Guid id = newTrans.Account.Id;
List<CreditTransaction> transactions = context.CreditTransactionSet.Where(ct => ct.Account.Id == id).OrderByDescending(ct => ct.CreatedOn).ToList();