C# 从不带regsvr32的文件创建COM对象

C# 从不带regsvr32的文件创建COM对象,c#,com,directshow,C#,Com,Directshow,是否可以仅使用dll而不使用regsvr32创建COM对象的实例 这里我的主要目标是创建directshow筛选器的实例并将其插入到我的图中,但我不想让我们使用regsvr32来注册筛选器。过滤器将位于dll/ax中,该dll/ax将与我的应用程序一起分发,并显示在我的路径中。我也会知道CLSID的 因此,基本上我只需要一种方法来创建该类型的实例,而只需要使用dll/ax和CLSID。这在C#中是否可能?当您创建COM实例时,Windows会在注册表中查找,找出要加载的dll,如何加载,然后加载

是否可以仅使用dll而不使用regsvr32创建COM对象的实例

这里我的主要目标是创建directshow筛选器的实例并将其插入到我的图中,但我不想让我们使用regsvr32来注册筛选器。过滤器将位于dll/ax中,该dll/ax将与我的应用程序一起分发,并显示在我的路径中。我也会知道CLSID的


因此,基本上我只需要一种方法来创建该类型的实例,而只需要使用dll/ax和CLSID。这在C#中是否可能?

当您创建COM实例时,Windows会在注册表中查找,找出要加载的dll,如何加载,然后加载dll并找到您要查找的类。如果你想跳过这个查找算法,那么你必须实现它,我认为这并不容易。但肯定是可行的


更新:寻找CoLoadLibrary函数,也许它毕竟没有那么难。我认为COM服务器在加载时会调用CoreRegisterClassObject,这就是Windows查找它们的方式,您可以调用CoGetClassObject。不过,我还不清楚,所以请继续阅读MSDN。

听起来像是您想要使用的。

有可能使用LoadLibrary()和GetProcAddress来获取DllGetClassObject()入口点。您正在绕过一堆COM管道代码,这些代码旨在让您落入成功的陷阱。特别是处理ThreadingModel的东西。或者,让32位代码在64位进程中运行的技巧对于视频来说往往很重要


将reg free COM与清单一起使用可能会使您陷入困境。

FYI:不,您不能对此使用fusion,因为directx筛选器需要更多的reg密钥才能在筛选器图中正确注册,fusion无法提供这些密钥。@wqw如果是这种情况,您可能希望将其添加为答案,因为在不注册COM组件的情况下使用COM组件的任何方法都不适用于这种情况。@wqw:不过,您可以使用regoverrideepredefkey来处理这些内容。()不幸的是,这看起来是正确的答案。至少我现在可以试一试。如果它适用于directshow,我将在此处报告详细信息。@wqw这不正确。完全可以“新建”过滤器并将其粘贴到图形中。注册表只对智能连接和类似功能是必需的。+1,我们这样做没有任何严重问题。一个警告是,不会进行编组。