我正在尝试在自定义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 });
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对象,我可能需要类似的东西吗?
因此,如果您有任何想法, 预先感谢您的帮助