Dll中的方法向外返回dynamic类型可能会失败
如果Dll中有某个类的方法返回dynamic实例,并且dynamic对象实际实例为匿名类类型,则Dll的外部使用者可能最终无法正常使用此dynamic对象。当使用此dynamic对象时,可能会遇到x属性没有在object中定义的错误,此错误属于Microsoft.CSharp.RuntimeBinder.RuntimeBinderException实例——即使Debug时,能够看到返回的对象实例确实含有x属性。
这很诡异,返回匿名类,并用dynamic进行标示是节省代码量的利器。但在此处,运行时却无法发现动态的对象类型。经过多次试验,再说明一下会出现此问题的场景:
环境为.Net Framework 4.6 & Visual Stdio 2015 Community.
在Dll中定义类方法,并返回dynamic。实际返回类型为匿名类型。
/// <summary>
/// 类库工程
/// </summary>
namespace dynamicdll
{
public class Student
{
public static dynamic GenerateOne()
{
return new { No = "", Name = "Dong", Age = };
}
在Dll外部调用此方法,打印其属性值。DLL外部是指在DLL工程外部,而不是不同的命名空间。
namespace LimsTest
{
class Program
{
static void Main(string[] args)
{
var st = GenerateOne();
Debug.WriteLine($"{st.No},{st.Name},{st.Age}");
运行以上测试代码,出现错误。

测试方法:
- 在同一个.csproject中,相同的代码、使用方法不会出现此问题。
- 在dll项目内部使用,不会出现问题。
- 只有在dll中定义,外部使用才会出现问题。
可能的原因:
- 程序加载Dll的一些特殊之处。可能是AppDomain加载DLL的一些机制问题。
- 如果字段、方法参数或者返回值的类型是dynamic,编译器会将该类型转换为System.Object,并在元数据中向字段、参数或返类型应用System.Runtime.CompilerService.DynamicAttribute的实例。从上图的错误中可以看到返回的对象已经被转换为Object,但却没有能成功应用Runtime binding。外部调用后,Runtime没有找不到合适的、或者不知道如何在执行动态运行转换。如果跟踪调试,虽然可以看到类型为匿名类,并且拥有属性(值),但是运行会失败。
解决方案:
返回非dynamic对象。
不要使用匿名对象作为dynamic的返回值。使用确定的、在DLL中明确定义的类,返回dynamic不会出现错误。
总结:
不要在DLL中向其外部使用者返回实际类型为匿名类的dynamic对象实例。
Dll中的方法向外返回dynamic类型可能会失败的更多相关文章
- C#反射动态调用dll中的方法,并返回结果(转)
反射的作用是动态的加载某个dll(程序集),并执行该程序集中的某个方法,并返回结果:当然也可以给该方法传递参数 namespace assembly_name { public class assem ...
- 使用clr 调用C#编写的dll中的方法的全解释
使用clr 调用C#编写的dll中的方法的全解释1.数据库初始化:将下面这段代码直接在运行就可以初始化数据库了exec sp_configure 'show advanced options', '1 ...
- 纯静态界面中(html)中通过js调用dll中的方法从数据库中读取数据
最近接到一个离职员工的任务,一个搭好框架的ERP系统,看了两天,说一下看到的东西,整个项目目录中我没发现一个.aspx后缀的文件,全是静态HTML文件,之后发现他用的jquery简直看的头疼,不过大概 ...
- 匿名类型 使用泛型T linq返回dynamic类型的匿名实体 如何把匿名类型.GetType()返回的对象传进泛型里面 EF实体查询出的数据List<T>转DataTable出现【DataSet 不支持 System.Nullable<>】的问题
[100分]紧急求助:LinQ下使用IQueryable<T>如何将返回类型<T>使用匿名类型 问题描述如下:我有一个方法如下:public IQueryable Dissen ...
- 13 继续C#中的方法,带返回值的方法介绍
在这一个练习中,我们要使用带返回值的方法.如果一个方法带返回值,那么它的形式是这样的. 定义一个带返回值的C#方法 static 返回类型 方法名字 (参数类型 参数1的名字,参数类型 参数2的名字) ...
- EF 6.x和EF Core实现返回dynamic类型
前言 未曾想需要直接返回dynamic,多次尝试未能实现,最终还是在stackoverflow上找到了解决方案,特此备忘录. public static dynamic SqlQuery(this D ...
- Go 语言中的方法,接口和嵌入类型
https://studygolang.com/articles/1113 概述 在 Go 语言中,如果一个结构体和一个嵌入字段同时实现了相同的接口会发生什么呢?我们猜一下,可能有两个问题: 编译器会 ...
- .NET Core 3.0 JsonSerializer.Deserialize 返回dynamic类型对象
.NET Core 3.0 JsonSerializer.Deserialize to dynamic object 因为官方还不支持返回动态类型的对象,只能自己手写一个,临时测试了下没问题,还有些地 ...
- C#反射动态调用dll中的方法
//加载程序集(dll文件地址),使用Assembly类 Assembly assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirec ...
随机推荐
- Linux下diff与patch命令的配合使用
在Linux下,diff与patch命令配合使用可以进行简单的代码维护工作. [A] diff diff命令用于比较文件的差异,可以用于制作patch文件.但此命令参数众多.格式多样,所以在此仅介绍较 ...
- 64位CentOS6.5下Eclipse用Java连接mysql
1.到官网上下载jdbc驱动,我下载的是mysql-connector-java-5.0.8.tar.gz 2.解压下载到的文件 tar -zxvf mysql-connector-java-5.0. ...
- G - Power Strings
Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc&quo ...
- [bzoj1010][HNOI2008]玩具装箱toy_斜率优化dp
玩具装箱toy bzoj-1010 HNOI-2008 题目大意:P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一 ...
- React Native Mac配置指南
步骤 http://facebook.github.io/react-native/docs/getting-started.html#content 依照React Native官网步骤一步步安装, ...
- ubuntu 14.04升级PHP5.5.9 到5.6
升级的步骤:参考https://www.digitalocean.com/community/questions/how-to-upgrade-from-php-v-5-5-9-to-v-5-6 su ...
- 阿里2016实习offer五面经验与总结
前言 眼下楼主已经拿到阿里实习offer,一共经历了5次面试,当中4轮技术面.1轮HR面试.在这里分享一下自己的面试经验和学习总结.写这篇面经主要是希望可以帮助很多其它的小伙伴.我本科毕业于中南大学信 ...
- 反射调用android系统级API函数
try { Class<?> mClass = Class.forName("com.android.server.wifi.WifiSettingsStore"); ...
- Android+Jquery Mobile学习系列(6)-个人信息设置
本节开始,进行代码的实战练习.我的这个App是管理保险客户信息的,数据采用Sqlite存储在本地手机上,第一次使用需要先登记自己的个人信息,这个功能非常简单,也无关紧要,我是拿这个练手,方便做后面复杂 ...
- Android+Jquery Mobile学习系列(5)-SQLite数据库
SQLite是轻量级的.嵌入式的.关系型数据库,目前已经在iPhone.Android等手机系统中使用,SQLite可移植性好,很容易使用,很小,高效而且可靠. 因为Android已经集成了SQLit ...