Skip to content

Commit 1dccc35

Browse files
author
Bernt Røskar Brenna
committed
.NET Core: Added extra refs for dynamic to work
1 parent 2808e99 commit 1dccc35

File tree

2 files changed

+66
-12
lines changed

2 files changed

+66
-12
lines changed

UnitTests/TestDynamicResponse.cs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,43 @@ public async Task UsingNewtonsoftJson()
139139
await AssertScriptCanIncludeUsingStatementAsync("Newtonsoft.Json");
140140
}
141141

142+
[Fact]
143+
public async Task UsingSystemDynamic()
144+
{
145+
await AssertScriptCanIncludeUsingStatementAsync("System.Dynamic");
146+
}
147+
148+
[Fact]
149+
public async Task ScriptsCanUseDynamicKeyword()
150+
{
151+
Assert.Equal("abc", await EvalAsync(@"
152+
using System.Dynamic;
153+
dynamic a = new ExpandoObject();
154+
a.Foobar = ""abc"";
155+
return a.Foobar;
156+
"));
157+
}
158+
159+
[Fact]
160+
public async Task ScriptsCanCompareDynamic()
161+
{
162+
Assert.Equal("True", await EvalAsync(@"
163+
dynamic a = ""abc"";
164+
var b = ""abc"";
165+
return (a == b).ToString();
166+
"));
167+
}
168+
169+
[Fact]
170+
public async Task ScriptsCanUseExpandoObject()
171+
{
172+
Assert.Equal("True", await EvalAsync(@"
173+
using System.Dynamic;
174+
var eo = new ExpandoObject();
175+
return (eo != null).ToString();
176+
"));
177+
}
178+
142179
private async Task AssertScriptCanIncludeUsingStatementAsync(string namespaceName)
143180
{
144181
Assert.Equal("OK", await EvalAsync($"using {namespaceName}; return \"OK\";"));

netmockery/DynamicResponseCreator.cs

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using System.Diagnostics;
88
using System.IO;
99
using System.Linq;
10+
using System.Linq.Expressions;
1011
using System.Net;
1112
using System.Reflection;
1213
#if !NET462
@@ -44,7 +45,18 @@ public string GetSourceCodeWithIncludesExecuted()
4445
sourceCode;
4546
}
4647

48+
4749
#if NET462
50+
public static IEnumerable<MetadataReference> GetDefaultMetadataReferences()
51+
{
52+
yield return MetadataReference.CreateFromFile(typeof(Enumerable).GetTypeInfo().Assembly.Location);
53+
yield return MetadataReference.CreateFromFile(typeof(System.Xml.Linq.XElement).GetTypeInfo().Assembly.Location);
54+
yield return MetadataReference.CreateFromFile(typeof(System.IO.File).GetTypeInfo().Assembly.Location);
55+
yield return MetadataReference.CreateFromFile(typeof(System.Diagnostics.Debug).GetTypeInfo().Assembly.Location);
56+
yield return MetadataReference.CreateFromFile(typeof(Newtonsoft.Json.JsonConvert).GetTypeInfo().Assembly.Location);
57+
yield return MetadataReference.CreateFromFile(typeof(Microsoft.CSharp.RuntimeBinder.RuntimeBinderException).GetTypeInfo().Assembly.Location);
58+
}
59+
4860
public override async Task<string> GetBodyAsync(RequestInfo requestInfo)
4961
{
5062
Debug.Assert(requestInfo != null);
@@ -53,11 +65,7 @@ public override async Task<string> GetBodyAsync(RequestInfo requestInfo)
5365
{
5466
//TODO: Debug logging of referenced assemblies
5567
var scriptOptions = ScriptOptions.Default.WithReferences(
56-
MetadataReference.CreateFromFile(typeof(Enumerable).GetTypeInfo().Assembly.Location), // System.Linq
57-
MetadataReference.CreateFromFile(typeof(System.Xml.Linq.XElement).GetTypeInfo().Assembly.Location), // System.Xml.Linq
58-
MetadataReference.CreateFromFile(typeof(System.IO.File).GetTypeInfo().Assembly.Location),
59-
MetadataReference.CreateFromFile(typeof(System.Diagnostics.Debug).GetTypeInfo().Assembly.Location),
60-
MetadataReference.CreateFromFile(typeof(Newtonsoft.Json.JsonConvert).GetTypeInfo().Assembly.Location)
68+
GetDefaultMetadataReferences().ToArray()
6169
);
6270

6371
var script = CSharpScript.Create<string>(
@@ -88,19 +96,28 @@ public override async Task<string> GetBodyAsync(RequestInfo requestInfo)
8896
return await task;
8997
}
9098
#else
99+
public static IEnumerable<MetadataReference> GetDefaultMetadataReferences()
100+
{
101+
yield return MetadataReference.CreateFromFile(typeof(Enumerable).GetTypeInfo().Assembly.Location);
102+
yield return MetadataReference.CreateFromFile(typeof(System.Xml.Linq.XElement).GetTypeInfo().Assembly.Location);
103+
yield return MetadataReference.CreateFromFile(typeof(System.IO.File).GetTypeInfo().Assembly.Location);
104+
yield return MetadataReference.CreateFromFile(typeof(System.Diagnostics.Debug).GetTypeInfo().Assembly.Location);
105+
yield return MetadataReference.CreateFromFile(typeof(System.Text.RegularExpressions.Regex).GetTypeInfo().Assembly.Location);
106+
yield return MetadataReference.CreateFromFile(typeof(Newtonsoft.Json.JsonConvert).GetTypeInfo().Assembly.Location);
107+
yield return MetadataReference.CreateFromFile(typeof(Queue<>).GetTypeInfo().Assembly.Location);
108+
yield return MetadataReference.CreateFromFile(typeof(System.Dynamic.ExpandoObject).GetTypeInfo().Assembly.Location);
109+
yield return MetadataReference.CreateFromFile(typeof(Microsoft.CSharp.RuntimeBinder.RuntimeBinderException).GetTypeInfo().Assembly.Location);
110+
yield return MetadataReference.CreateFromFile(typeof(ExpressionType).GetTypeInfo().Assembly.Location);
111+
112+
}
113+
91114
public override async Task<string> GetBodyAsync(RequestInfo requestInfo)
92115
{
93116
//TODO: Only create script object if source has changed
94117
Debug.Assert(requestInfo != null);
95118

96119
var scriptOptions = ScriptOptions.Default.WithReferences(
97-
MetadataReference.CreateFromFile(typeof(Enumerable).GetTypeInfo().Assembly.Location), // System.Linq
98-
MetadataReference.CreateFromFile(typeof(System.Xml.Linq.XElement).GetTypeInfo().Assembly.Location), // System.Xml.Linq
99-
MetadataReference.CreateFromFile(typeof(System.IO.File).GetTypeInfo().Assembly.Location),
100-
MetadataReference.CreateFromFile(typeof(System.Diagnostics.Debug).GetTypeInfo().Assembly.Location),
101-
MetadataReference.CreateFromFile(typeof(System.Text.RegularExpressions.Regex).GetTypeInfo().Assembly.Location),
102-
MetadataReference.CreateFromFile(typeof(Newtonsoft.Json.JsonConvert).GetTypeInfo().Assembly.Location),
103-
MetadataReference.CreateFromFile(typeof(Queue<>).GetTypeInfo().Assembly.Location)
120+
GetDefaultMetadataReferences().ToArray()
104121
);
105122

106123
var script = CSharpScript.Create<string>(

0 commit comments

Comments
 (0)