.net Type.GetType通过COM互操作调用时返回null

.net Type.GetType通过COM互操作调用时返回null,.net,com-interop,.net,Com Interop,我有一个程序集,其中包含CustomSettings提供程序MySettingProvider。本机进程将此程序集创建为COM对象,然后CLR尝试使用type.GetType调用按名称解析提供程序类型 如果我尝试直接在的启动代码中解析类型: var aqn = typeof(MySettingProvider).AssemblyQualifiedName; var providerType = Type.GetType(aqn); 这很有效 但由于某种原因,从系统程序集中调用了Type.Get

我有一个程序集,其中包含CustomSettings提供程序MySettingProvider。本机进程将此程序集创建为COM对象,然后CLR尝试使用type.GetType调用按名称解析提供程序类型

如果我尝试直接在的启动代码中解析类型:

var aqn = typeof(MySettingProvider).AssemblyQualifiedName;
var providerType = Type.GetType(aqn);
这很有效

但由于某种原因,从系统程序集中调用了Type.GetType:

System.dll!System.Configuration.ApplicationSettingsBase.CreateSetting(System.Reflection.PropertyInfo-propInfo)第426 C行#

返回空值

程序集限定名称在两种情况下相同

如果我不是以COM对象的形式启动程序集,而是以托管进程中的常规程序集的形式启动程序集,那么Type.GetType在两种情况下都有效:在启动代码中和在System.Configuration.ApplicationSettingsBase中

如果我再添加一个嵌套级别并尝试在程序集B中创建类型,它也可以工作

一些带有调用堆栈的“图片”:

native.exe
  -> COM interop
    -> A.dll
      -> Type.GetType: OK
      -> B.dll
        -> Type.GetType: OK
      -> System.Configuration.ApplicationSettingsBase
        -> Type.GetType: null

managed.exe
  -> A.dll
    -> Type.GetType: OK
    -> B.dll
      -> Type.GetType: OK
    -> System.Configuration.ApplicationSettingsBase
      -> Type.GetType: OK

有什么想法吗?

我的水晶球显示该类型。GetType(string)返回null,因为您没有做任何事情来帮助CLR找到包含您的
MySettingProvider
类的程序集。这是必需的,CLR本身不太可能找到它。通过将程序集复制到与“native.exe”相同的目录中,使其位于探测路径中,您可以自己快速测试它


这是一个完全不合适的解决方案当然,[ComVisible]程序集无法选择使用它的应用程序类型。您需要通过在GAC中存储任何依赖项来提供帮助。GAC也是您的主程序集所属的地方,它是COM的DLL地狱问题的一个很好的解决方案。无论如何,在用户的机器上,您可以通过复制文件在自己的机器上进行测试。您可能能够使AppDomain.AssemblyResolve正常工作,但您需要一个类似“全局”对象的应用程序,以确保及时注册事件处理程序

几分钟前,我发现AppDomain.CurrentDomain.AssemblyResolve解决了问题:)但无论如何还是要谢谢你。嗯,水晶球确实低声说:“他没有研究他的问题,不要麻烦。”。欢迎光临。我以前不知道加载上下文。。。这阻止了我对程序集位置的实验。我敢肯定,如果一个加载,那么它可以找到无论如何。