GeneratedComInterface/Class needs a way to register a factory method
Nobody has claimed this yet.
Assessment
- Difficulty
- 5/5
- Estimated time
- Over a week
- Newbie friendliness
- 35/100
- Issue type
- Feature
- Clarity
- Mostly clear
- Activity status
- Quiet
- Tech stack
- csharp
- Domain
- operating-systems
Research direction
Start by reviewing the GeneratedComClass and GeneratedComInterface entry points and the existing ExtensibleClassFactory.RegisterObjectCreationCallback behavior. Compare the requested factory-registration flow with ComInterfaceMarshaller.ConvertToManaged and the MyClass usage shown in the issue. Done means a supported generated-COM pattern that lets callers construct MyClass directly while preserving factory callback behavior.
Written by the indexing model from the issue text.
Description
In built in COM we had ExtensibleClassFactory.RegisterObjectCreationCallback where we could register a factory method (often in native code)
[ComImport, Guid(<guid1>)]
public interface IMyInterface
{
void DoStuff();
}
[ComImport, Guid(<guid2>)]
public class MyClassHelper : IMyInterface
{
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
public virtual extern void DoStuff();
}
[Guid(<guid2>)]
public class MyClass : MyClassHelper
{
static MyClass()
{
ExtensibleClassFactory.RegisterObjectCreationCallback(new ObjectCreationDelegate(CreateComInstanceDelegate));
}
private static IntPtr CreateComInstanceDelegate(IntPtr aggr)
{
return NativeMethods.CreateComInstance(typeof(MyClass).Guid);
}
}
// usage
var inst = new MyClass();
inst.DoStuff();
in source generated COM I can do:
[GeneratedComInterface, Guid(<guid1>)]
public interface IMyInterface
{
void DoStuff();
}
// usage
var ptr = NativeMethods.CreateComInstance(typeof(MyClass).Guid);
var inst = ComInterfaceMarshaller<IMyInterface>.ConvertToManaged(ptr);
inst.DoStuff();
which is not as straight forward as before.
Instead I can use the decorator pattern:
[GeneratedComClass, Guid(<guid2>)]
public class MyClass : IMyInterface
{
private IMyInterface _inner;
public MyClass()
{
var ptr = NativeMethods.CreateComInstance(typeof(MyClass).Guid);
_inner = ComInterfaceMarshaller<IMyInterface>.ConvertToManaged(ptr);
}
public void DoStuff() => _inner.DoStuff();
}
// usage
var inst = new MyClass();
inst.DoStuff();
I know I can probably write a source generator that does exactly that but it will be great if the default tooling could do that for us.
something like:
[GeneratedComClassWrapper(typeof(IMyInterface)), Guid(<guid2>)]
public class MyClass
{
static MyClass()
{
RegisterObjectCreationCallback(static _ => NativeMethods.CreateComInstance(typeof(MyClass).Guid));
}
}
// usage
var inst = new MyClass();
inst.DoStuff();
This would help migrating dotnet framework code that make heavy use of builtin COM interop.
EDIT: fixed declaration of _inner
- Dominant language
- C#
- Stars
- 18.3k
- Forks
- 5.6k
- PR merge metrics
- PR metrics pending
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from dotnet/runtime
-
agentic-workflows untriaged
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
-
area-System.Reflection blocking-clean-ci-optional Known Build Error os-mac-os-x untriaged
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
-
area-CodeGen-coreclr untriaged
Difficulty 1/5 Under an hour Newbie friendliness 92/100
-
agentic-workflows untriaged
Difficulty 1/5 Under an hour Newbie friendliness 78/100
-
area-VM-meta-mono untriaged
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
-
:watch: Not Triaged 11.0 fundamentals/subsvc
Difficulty 2/5 1-3 hours Newbie friendliness 92/100
dotnet/AspNetCore.Docs#37699 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
SubtitleEdit/subtitleedit#15108 · 1 comment ·
-
area/docs-content Bug pulumi/docs
Difficulty 1/5 1-3 hours Newbie friendliness 94/100
-
Create parent directories only after the containment check in InstallHelper.TryExtractToDirectory Open
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
PowerShell/PSResourceGet#2056 ·