using System.Runtime.InteropServices;
using System.Reflection;
using System.Numerics.Hashing;
+using Microsoft.CSharp.RuntimeBinder.Errors;
namespace Microsoft.CSharp.RuntimeBinder
{
return obj != null && Marshal.IsComObject(obj);
}
-#if ENABLECOMBINDER
/////////////////////////////////////////////////////////////////////////////////
// Try to determine if this object represents a WindowsRuntime object - i.e. it either
return false;
}
-#endif
+
/////////////////////////////////////////////////////////////////////////////////
private static bool IsTransparentProxy(object obj)
return true;
}
+
+#if !ENABLECOMBINDER
+ internal static void ThrowIfUsingDynamicCom(DynamicMetaObject target)
+ {
+ if (!BinderHelper.IsWindowsRuntimeObject(target) && target.LimitType.IsCOMObject)
+ {
+ throw ErrorHandling.Error(ErrorCode.ERR_DynamicBindingComUnsupported);
+ }
+ }
+#endif
}
}
using System.Diagnostics.CodeAnalysis;
using System.Dynamic;
using System.Numerics.Hashing;
+using Microsoft.CSharp.RuntimeBinder.Errors;
using Microsoft.CSharp.RuntimeBinder.Semantics;
namespace Microsoft.CSharp.RuntimeBinder
{
return com;
}
+#else
+ BinderHelper.ThrowIfUsingDynamicCom(target);
#endif
+
BinderHelper.ValidateBindArgument(target, nameof(target));
return BinderHelper.Bind(this, _binder, new[] { target }, null, errorSuggestion);
}
using System;
using System.Collections.Generic;
using System.Dynamic;
+using Microsoft.CSharp.RuntimeBinder.Errors;
using Microsoft.CSharp.RuntimeBinder.Semantics;
namespace Microsoft.CSharp.RuntimeBinder
{
#if ENABLECOMBINDER
DynamicMetaObject com;
- if (!BinderHelper.IsWindowsRuntimeObject(target) && ComBinder.TryBindGetIndex(this, target, indexes, out com))
+ if (!BinderHelper.IsWindowsRuntimeObject(target) && ComBinder.TryConvert(this, target, out com))
{
return com;
}
+#else
+ BinderHelper.ThrowIfUsingDynamicCom(target);
#endif
+
BinderHelper.ValidateBindArgument(target, nameof(target));
BinderHelper.ValidateBindArgument(indexes, nameof(indexes));
return BinderHelper.Bind(this, _binder, BinderHelper.Cons(target, indexes), _argumentInfo, errorSuggestion);
using System.Diagnostics;
using System.Dynamic;
using System.Numerics.Hashing;
+using Microsoft.CSharp.RuntimeBinder.Errors;
using Microsoft.CSharp.RuntimeBinder.Semantics;
namespace Microsoft.CSharp.RuntimeBinder
{
#if ENABLECOMBINDER
DynamicMetaObject com;
- if (!BinderHelper.IsWindowsRuntimeObject(target) && ComBinder.TryBindGetMember(this, target, out com, ResultIndexed))
+ if (!BinderHelper.IsWindowsRuntimeObject(target) && ComBinder.TryConvert(this, target, out com))
{
return com;
}
+#else
+ BinderHelper.ThrowIfUsingDynamicCom(target);
#endif
+
BinderHelper.ValidateBindArgument(target, nameof(target));
return BinderHelper.Bind(this, _binder, new[] { target }, _argumentInfo, errorSuggestion);
}
using System.Collections.Generic;
using System.Dynamic;
using System.Numerics.Hashing;
+using Microsoft.CSharp.RuntimeBinder.Errors;
using Microsoft.CSharp.RuntimeBinder.Semantics;
namespace Microsoft.CSharp.RuntimeBinder
public override DynamicMetaObject FallbackInvoke(DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion)
{
#if ENABLECOMBINDER
-
DynamicMetaObject com;
- if (!BinderHelper.IsWindowsRuntimeObject(target) && ComBinder.TryBindInvoke(this, target, args, out com))
+ if (!BinderHelper.IsWindowsRuntimeObject(target) && ComBinder.TryConvert(this, target, out com))
{
return com;
}
+#else
+ BinderHelper.ThrowIfUsingDynamicCom(target);
#endif
+
BinderHelper.ValidateBindArgument(target, nameof(target));
BinderHelper.ValidateBindArgument(args, nameof(args));
return BinderHelper.Bind(this, _binder, BinderHelper.Cons(target, args), _argumentInfo, errorSuggestion);
using System.Collections.ObjectModel;
using System.Dynamic;
using System.Numerics.Hashing;
+using Microsoft.CSharp.RuntimeBinder.Errors;
using Microsoft.CSharp.RuntimeBinder.Semantics;
namespace Microsoft.CSharp.RuntimeBinder
{
#if ENABLECOMBINDER
DynamicMetaObject com;
- if (!BinderHelper.IsWindowsRuntimeObject(target) && ComBinder.TryBindInvokeMember(this, target, args, out com))
+ if (!BinderHelper.IsWindowsRuntimeObject(target) && ComBinder.TryConvert(this, target, out com))
{
return com;
}
+#else
+ BinderHelper.ThrowIfUsingDynamicCom(target);
#endif
+
BinderHelper.ValidateBindArgument(target, nameof(target));
BinderHelper.ValidateBindArgument(args, nameof(args));
return BinderHelper.Bind(this, _binder, BinderHelper.Cons(target, args), _argumentInfo, errorSuggestion);
using System.Collections.Generic;
using System.Dynamic;
using System.Numerics.Hashing;
+using Microsoft.CSharp.RuntimeBinder.Errors;
using Microsoft.CSharp.RuntimeBinder.Semantics;
namespace Microsoft.CSharp.RuntimeBinder
{
#if ENABLECOMBINDER
DynamicMetaObject com;
- if (!BinderHelper.IsWindowsRuntimeObject(target) && ComBinder.TryBindSetIndex(this, target, indexes, value, out com))
+ if (!BinderHelper.IsWindowsRuntimeObject(target) && ComBinder.TryConvert(this, target, out com))
{
return com;
}
+#else
+ BinderHelper.ThrowIfUsingDynamicCom(target);
#endif
+
BinderHelper.ValidateBindArgument(target, nameof(target));
BinderHelper.ValidateBindArgument(indexes, nameof(indexes));
BinderHelper.ValidateBindArgument(value, nameof(value));
using System.Collections.Generic;
using System.Dynamic;
using System.Numerics.Hashing;
+using Microsoft.CSharp.RuntimeBinder.Errors;
using Microsoft.CSharp.RuntimeBinder.Semantics;
namespace Microsoft.CSharp.RuntimeBinder
{
#if ENABLECOMBINDER
DynamicMetaObject com;
- if (!BinderHelper.IsWindowsRuntimeObject(target) && ComBinder.TryBindSetMember(this, target, value, out com))
+ if (!BinderHelper.IsWindowsRuntimeObject(target) && ComBinder.TryConvert(this, target, out com))
{
return com;
}
+#else
+ BinderHelper.ThrowIfUsingDynamicCom(target);
#endif
+
BinderHelper.ValidateBindArgument(target, nameof(target));
BinderHelper.ValidateBindArgument(value, nameof(value));
return BinderHelper.Bind(this, _binder, new[] { target, value }, _argumentInfo, errorSuggestion);
ERR_NamedArgumentUsedInPositional = 1744,
ERR_BadNamedArgumentForDelegateInvoke = 1746,
ERR_NonInvocableMemberCalled = 1955,
- ERR_BadNonTrailingNamedArgument = 8323
+ ERR_BadNonTrailingNamedArgument = 8323,
+ ERR_DynamicBindingComUnsupported = 8365
}
}
case ErrorCode.ERR_BadNonTrailingNamedArgument:
codeStr = SR.BadNonTrailingNamedArgument;
break;
-
+ case ErrorCode.ERR_DynamicBindingComUnsupported:
+ codeStr = SR.DynamicBindingComUnsupported;
+ break;
default:
// means missing resources match the code entry
Debug.Fail("Missing resources for the error " + code.ToString());
<data name="AnonMethod" xml:space="preserve">
<value>anonymous method</value>
</data>
+ <data name="DynamicBindingComUnsupported" xml:space="preserve">
+ <value>The C# runtime binder cannot dynamically resolve members on COM Runtime Callable Wrappers.</value>
+ </data>
<data name="ERRORSYM" xml:space="preserve">
<value><error></value>
</data>
using System.Collections;
using System.ComponentModel;
using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
using Xunit;
// IVT to "Microsoft.CSharp.RuntimeBinder.Binder", just to use IVT in a test (see: InternalsVisibleToTest below)
public void GenericNameMatchesPredefined()
{
dynamic d = 3;
- dynamic v = new Value<int> {Quantity = d};
+ dynamic v = new Value<int> { Quantity = d };
dynamic r = v.Quantity;
Assert.Equal(3, r);
dynamic h = new Holder();
Func<CallSite, ICounterBoth, object> target2 = getter.Target;
Assert.Equal(message, Assert.Throws<RuntimeBinderException>(() => target2(getter, null)).Message);
}
+
+ // This is not the defined COM interface for IKnownFolderManager.
+ // We need a registered COM interface and CoClass to validate the behavior with dynamic and COM.
+ // The real IKnownFolderManager interface is available on Windows Vista+, so it is on all platforms that we're testing.
+ [ComImport]
+ [Guid("8BE2D872-86AA-4d47-B776-32CCA40C7018")]
+ interface Not_IKnownFolderManager
+ {
+ void MethodCall();
+
+ int this[int i] { get; set; }
+
+ int Property { get; set; }
+ }
+
+ [CoClass(typeof(KnownFolderManagerClass))]
+ [ComImport]
+ [Guid("8BE2D872-86AA-4d47-B776-32CCA40C7018")]
+ interface KnownFolderManager : Not_IKnownFolderManager { }
+
+ [Guid("4df0c730-df9d-4ae3-9153-aa6b82e9795a")]
+ class KnownFolderManagerClass { }
+
+ [Fact]
+ [PlatformSpecific(TestPlatforms.Windows)]
+ [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework)]
+ public void DynamicComThrowsException()
+ {
+ Assert.Throws<RuntimeBinderException>(() =>
+ {
+ var a = new { Manager = new KnownFolderManagerClass() };
+ dynamic d = a;
+ d.Manager.MethodCall();
+ });
+ Assert.Throws<RuntimeBinderException>(() =>
+ {
+ var a = new { Manager = new KnownFolderManagerClass() };
+ dynamic d = a;
+ return d.Manager[0];
+ });
+ Assert.Throws<RuntimeBinderException>(() =>
+ {
+ var a = new { Manager = new KnownFolderManagerClass() };
+ dynamic d = a;
+ d.Manager[0] = 1;
+ });
+ Assert.Throws<RuntimeBinderException>(() =>
+ {
+ var a = new { Manager = new KnownFolderManagerClass() };
+ dynamic d = a;
+ d.Manager.Property = 1;
+ });
+ Assert.Throws<RuntimeBinderException>(() =>
+ {
+ var a = new { Manager = new KnownFolderManagerClass() };
+ dynamic d = a;
+ d.Manager.Property = 1;
+ });
+ }
}
}