System.TypeLoadException при попытке создать экземпляр COM-объекта C ++ внутри пользовательского домена приложения - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь динамически загрузить 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 # и мой C ++ COM-объект создаются в режиме X64.
  • Работает, если я создаю экземпляр в домене по умолчанию, например ((API.AddIn)Activator.CreateInstance(addinComType)).connectToAPI(null)

Так что я не знаю, откуда возникла эта проблема.

В C # мой COM-объект наследуется от MarshalByRefObject возможно, мне нужно что-то подобное для C ++COM-объект?

Так что если у вас есть идеи, заранее спасибо за помощь

...