在vb.net项目上使用时,C#DLL不起作用

前端之家收集整理的这篇文章主要介绍了在vb.net项目上使用时,C#DLL不起作用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用vb.net 2013.
我尝试使用我使用NUGET安装的工具.
EntityFramewrok.Utilities / link: https://github.com/MikaelEliasson/EntityFramework.Utilities
这是一个开源的DLL,可以下载整个代码.
从这个DLL,我正在尝试使用“IncludeEFU”方法.
在上面的链接中,是我在C#项目上使用的代码并且有效:
  1. var result = db.Contacts
  2. .IncludeEFU(db,x => x.PhoneNumbers
  3. .Where(n => n.Number == "10134")
  4. .OrderBy(p => p.ContactId)
  5. .ThenByDescending(p => p.Number))
  6. .ToList();

我尝试在我的VB.net应用程序上使用相同的代码

  1. Dim result = db.Contacts _
  2. .IncludeEFU(db,Function(x) x.PhoneNumbers _
  3. .Where(Function(n) n.Number = "10134")_
  4. .OrderBy(Function(p) p.ContactId) _
  5. .ThenByDescending(Function(p) p.Number)).ToList()

但我收到一个错误

  1. An unhandled exception of type 'System.ArgumentException' occurred in EntityFramework.Utilities.dll
  2.  
  3. Additional information: Could not find a MemberExpression

逐个检查dll项目中的文件(可以在链接上下载),我看到我收到的错误消息来自这个子:

  1. private static PropertyInfo SetCollectionModifiersAndGetChildProperty<T,TChild>(Expression<Func<T,IEnumerable<TChild>>> collectionSelector,List<MethodCallExpression> childCollectionModifiers)
  2. where T : class
  3. where TChild : class
  4. {
  5. var temp = collectionSelector.Body;
  6. while (temp is MethodCallExpression)
  7. {
  8. var mce = temp as MethodCallExpression;
  9. childCollectionModifiers.Add(mce);
  10. temp = mce.Arguments[0];
  11. }
  12. childCollectionModifiers.Reverse(); //We parse from right to left so reverse it
  13. if (!(temp is MemberExpression))
  14. {
  15. throw new ArgumentException("Could not find a MemberExpression","collectionSelector");
  16. }
  17.  
  18. var childProp = (temp as MemberExpression).Member as PropertyInfo;
  19. return childProp;
  20. }

看看这一行:

  1. throw new ArgumentException("Could not find a MemberExpression","collectionSelector");

为什么这是在C#项目上工作,并在VB.net项目上产生这个错误
我该如何解决这个问题?
谢谢 !

编辑:我尝试在该子目录中进行一些更改:

  1. ...
  2.  
  3. while (temp is MethodCallExpression)
  4. {
  5. var mce = temp as MethodCallExpression;
  6. childCollectionModifiers.Add(mce);
  7. temp = mce.Arguments[0];
  8. }
  9. while (temp is UnaryExpression)
  10. {
  11. var ue = temp as UnaryExpression;
  12. temp = ue.Operand;
  13. }
  14. .....

重建dll文件后,现在错误消息消失了.
但任何人都可以确认这是一个正确的解决方案吗?

最初的EntityFramework.Utilities DLL可能是使用与VB.NET应用程序不同的.NET“目标框架”构建的.

这可以解释为什么原始DLL在您重建的DLL(使用在VS.NET 2013中为您的项目定义的相同.NET“目标框架”)确实有效时不起作用.

要检查VS.NET的“目标框架”,请右键单击解决方案资源管理器中的适用项目,然后单击“属性”选项. “应用程序”选项卡将显示“目标框架:”标签,其中包含可用的.NET Framework版本号的下拉输入.此下拉列表的当前设置是.NET“目标框架”,用于在VS.NET 2013中进行构建.

猜你在找的VB相关文章