首页 > 解决方案 > 尝试在自定义 AppDomain 中创建 C++ COM 对象的实例时出现 System.TypeLoadException

问题描述

我正在尝试在自定义 AppDomain 中动态加载 COM 对象。

所以我做了这段代码,它使用 C# COM 对象但不使用 C++ COM 对象。

Type addinComType = Type.GetTypeFromCLSID(Guid.Parse(guid));
string basePath = Directory.GetParent(addinComType.Assembly.Location).FullName;
string dllName = Path.GetFileNameWithoutExtension(addinComType.Assembly.Location);
string completePath = addinComType.Assembly.Location;
string typeName = addinComType.Name;


AppDomainSetup setup = new AppDomainSetup()
{
    ApplicationBase = basePath,
    ApplicationName = dllName,
    ConfigurationFile = dllName + ".dll.config",
    PrivateBinPath = $"{basePath};{AppDomain.CurrentDomain.SetupInformation.ApplicationBase}"
};

AppDomain customDomain = AppDomain.CreateDomain(guid, null, setup);
ObjectHandle objectHandleFromCustomDomain = customDomain.CreateComInstanceFrom(completePath, typeName); //Thrown exception
object addinObjectFromCustomDomain = objectHandleFromCustomDomain.Unwrap();
MethodInfo myAddinMethodFromCustomDomain = addinObjectFromCustomDomain.GetType().GetMethod("connectToAPI");
myAddinMethodFromCustomDomain.Invoke(addinObjectFromCustomDomain, new object[] { null });

此代码生成

System.TypeLoadException: Impossible to load type '__ComObject' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
à System.Reflection.RuntimeAssembly.GetType(RuntimeAssembly assembly, String name, Boolean throwOnError, Boolean ignoreCase, ObjectHandleOnStack type)
à System.Reflection.RuntimeAssembly.GetType(String name, Boolean throwOnError, Boolean ignoreCase)
à System.Activator.CreateComInstanceFrom(String assemblyName, String typeName, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm)
à System.AppDomain.CreateComInstanceFrom(String assemblyName, String typeName)
à System.AppDomain.CreateComInstanceFrom(String assemblyName, String typeName)
à ConsoleApp1.AddinLoader.LoadAddin(String guid) dans C:\Users\me\Documents\Visual Studio 2017\Projects\ConsoleApp1\ConsoleApp1\AddinLoader.cs:ligne 113

所以我不知道这个问题是从哪里来的。

在 C# 中,我的 COM 对象从MarshalByRefObject继承,也许我需要类似 C++ COM 对象的东西?

因此,如果您有任何想法,请提前感谢您的帮助

标签: c#c++comappdomain

解决方案


推荐阅读