尝试在自定义AppDomain中创建C ++ COM对象的实例时发生System.TypeLoadException

时间:2018-10-23 09:29:19

标签: c# c++ com appdomain

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

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

db.fullset.find({A_DELAY: {$lt: 0}, D_DELAY: {$lt: 0}}).forEach(function(doc){
   db.subset.insert(doc);
});

此代码生成

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 });
  • C#应用程序和我的C ++ COM对象是在X64模式下构建的。
  • 如果我在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对象,我可能需要类似的东西吗?

因此,如果您有任何想法, 预先感谢您的帮助

0 个答案:

没有答案
相关问题