C# 进程内托管服务器的自定义COM类工厂
我正在研究在C# 进程内托管服务器的自定义COM类工厂,c#,.net,com,com-interop,class-factory,C#,.net,Com,Com Interop,Class Factory,我正在研究在MkParseDisplayName/BindToObject中为托管类库实现自定义COM激活逻辑 这样,从VB创建对象可能如下所示: obj = GetObject("clsid:12341234-1234-1234-1234-123412341234:!UniqueObjectId") 对于进程外服务器(使用CoRegisterClassObject)来说,这不是问题。但是,对于in-proc服务器,我需要更改DllGetClassObject的实现,它通常由mscoree.d
MkParseDisplayName/BindToObject
中为托管类库实现自定义COM激活逻辑
这样,从VB创建对象可能如下所示:
obj = GetObject("clsid:12341234-1234-1234-1234-123412341234:!UniqueObjectId")
对于进程外服务器(使用CoRegisterClassObject
)来说,这不是问题。但是,对于in-proc服务器,我需要更改DllGetClassObject
的实现,它通常由mscoree.dll
提供这可能吗?
我看到的唯一其他选择是创建一个类工厂,作为类工厂并在其上实现。理论上,这样的单例还可以向
CoRegisterClassObject(CLSCTX\u INPROC\u SERVER)
注册一个自定义的IClassFactory
类对象,但单例本身无论如何都需要先实例化。您想在给定特定字符串的情况下创建不同的对象吗,或者只是将参数传递给新创建的对象?在后一种情况下,您可以在12341234-1234-1234-1234-1234-1234-1234123411234 guid后面的.NET类上声明并实现IParseDisplayName。@SimonMourier,原始COM DLL(它是C#中重写的候选对象)有一个实现IParseDisplayName
的类工厂(与前面描述的完全相同),然后根据名字对象的尾随项创建不同的对象。理想情况下,我希望保持这种行为。您可以破坏默认的.NET注册表设置以指向特定的DLL,而不是MSCorei。我想了想,但我不知道如何从托管的C#DLL导出DllGetClassObject
,不确定这是否可行。是的,这是可能的,但有点黑客(但您已经进入黑客世界:-):