dotnet / dotnet/docs

OutOfProcCOM not working with clients in PowerShell or using C# dynamic

Open
#22,364 7 comments 0 reactions 0 assignees View on GitHub
waiting-on-feedback
Dominant language
No language data
Stars
4.8k
Forks
6.1k
Avg merge
15h 21m
Merged PRs (30d)
370

Description

**Issue description**

With clients in PowerShell or using C# dynamic, I cannot get the [OutOfProcCOM example](https://github.com/dotnet/samples/tree/master/core/extensions/OutOfProcCOM) to work; I additionally tried it with Pyhton, too, and it didn't work, but I'm not too firm with Pyhton.

C# .NET5 dynamic:

> Environment.Version
[5.0.2]
> var type = Type.GetTypeFromCLSID(Guid.Parse("AF080472-F173-4D9D-8BE7-435776617347"));
> dynamic c = Activator.CreateInstance(type);
> c.ComputePi()
System.NotSupportedException: Specified method is not supported.
+ System.Runtime.InteropServices.Marshal.ThrowExceptionForHR(int)
+ Microsoft.CSharp.RuntimeBinder.ComInterop.ComRuntimeHelpers.GetITypeInfoFromIDispatch(Microsoft.CSharp.RuntimeBinder.ComInterop.IDispatch)
+ Microsoft.CSharp.RuntimeBinder.ComInterop.IDispatchComObject.EnsureScanDefinedMethods()
+ Microsoft.CSharp.RuntimeBinder.ComInterop.IDispatchComObject.System.Dynamic.IDynamicMetaObjectProvider.GetMetaObject(System.Linq.Expressions.Expression)
+ System.Dynamic.DynamicMetaObject.Create(object, System.Linq.Expressions.Expression)
+ System.Dynamic.DynamicMetaObjectBinder.Bind(object[], ReadOnlyCollection, System.Linq.Expressions.LabelTarget)
+ System.Runtime.CompilerServices.CallSiteBinder.BindCore(CallSite, object[])
+ System.Dynamic.UpdateDelegates.UpdateAndExecute1(System.Runtime.CompilerServices.CallSite, T0)
+ System.Dynamic.UpdateDelegates.UpdateAndExecute1(System.Runtime.CompilerServices.CallSite, T0)

Exactly the same exception was thrown after I added `dynamic dyn = obj; dyn.ComputePi();` in the ManagedClient project of the example.

C# .NET Framework 4 dynamic:

> Environment.Version
[4.0.30319.42000]
> var type = Type.GetTypeFromCLSID(Guid.Parse("AF080472-F173-4D9D-8BE7-435776617347"));
> dynamic c = Activator.CreateInstance(type);
> c.ComputePi()
System.NotSupportedException: Specified method is not supported.
+ System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(int, System.IntPtr)
+ System.Dynamic.ComRuntimeHelpers.GetITypeInfoFromIDispatch(System.Dynamic.IDispatch, bool)
+ System.Dynamic.IDispatchComObject.EnsureScanDefinedMethods()
+ System.Dynamic.IDispatchComObject.System.Dynamic.IDynamicMetaObjectProvider.GetMetaObject(System.Linq.Expressions.Expression)
+ System.Dynamic.DynamicMetaObject.Create(object, System.Linq.Expressions.Expression)
+ System.Dynamic.DynamicMetaObjectBinder.Bind(object[], ReadOnlyCollection, System.Linq.Expressions.LabelTarget)
+ System.Runtime.CompilerServices.CallSiteBinder.BindCore(CallSite, object[])
+ System.Dynamic.UpdateDelegates.UpdateAndExecute1(System.Runtime.CompilerServices.CallSite, T0)
+ System.Dynamic.UpdateDelegates.UpdateAndExecute1(System.Runtime.CompilerServices.CallSite, T0)

PowerShell 5:

> $PSVersionTable

Name Value
---- -----
PSVersion 5.1.17763.1490
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.17763.1490
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1

> $type = [Type]::GetTypeFromCLSID("AF080472-F173-4D9D-8BE7-435776617347")
> $c = [Activator]::CreateInstance($type)
> $c.ComputePi()
Specified method is not supported.
At line:1 char:1
+ $c.ComputePi()
+ ~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (:) [], NotSupportedException
+ FullyQualifiedErrorId : System.NotSupportedException

PowerShell 7.1.0:

> $PSVersionTable

Name Value
---- -----
PSVersion 7.1.0
PSEdition Core
GitCommitId 7.1.0
OS Microsoft Windows 10.0.17763
Platform Win32NT
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
WSManStackVersion 3.0

> $type = [Type]::GetTypeFromCLSID("AF080472-F173-4D9D-8BE7-435776617347")
> $c = [Activator]::CreateInstance($type)
> $c.ComputePi()
OperationStopped: Specified method is not supported.

I tried adding support for `IDispatch` to the OutOfProcCOM example, and changed the target to .NET 5, but the behavior remained unchanged. I guess I didn't add that `IDispatch` support correctly because I don't have the necessary knowledge.

By the way, an out-of-process COM server I created with .NET Framework 4.7 (what required some workarounds) works with PowerShell and C# dynamic clients and all other clients I know.

**Target framework**

- [x] .NET Core 3.1, 5
- [ ] .NET Framework
- [ ] .NET Standard

dotnet --info output or About VS info

```console
.NET SDK (reflecting any global.json):
Version: 5.0.102
Commit: 71365b4d42

Runtime Environment:
OS Name: Windows
OS Version: 10.0.17763
OS Platform: Windows
RID: win10-x64
Base Path: C:\Program Files\dotnet\sdk\5.0.102\

Host (useful for support):
Version: 5.0.2
Commit: cb5f173b96

.NET SDKs installed:
5.0.102 [C:\Program Files\dotnet\sdk]

.NET runtimes installed:
Microsoft.AspNetCore.All 2.1.24 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
Microsoft.AspNetCore.App 2.1.24 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 3.1.11 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 5.0.2 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.NETCore.App 2.1.24 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 3.1.11 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 5.0.2 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.WindowsDesktop.App 3.1.11 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 5.0.2 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.