c# - 尝试在自定义 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# 应用程序和我的 C++ COM 对象是在 X64 模式下构建的。
- 如果我在默认域中创建实例,例如
((API.AddIn)Activator.CreateInstance(addinComType)).connectToAPI(null)
所以我不知道这个问题是从哪里来的。
在 C# 中,我的 COM 对象从MarshalByRefObject继承,也许我需要类似 C++ COM 对象的东西?
因此,如果您有任何想法,请提前感谢您的帮助
解决方案
推荐阅读
- python - 贝叶斯网络:与 R 相比,Python 中的结构学习非常慢
- database - 项目正在运行但数据库连接未找到
- r - 在 X 轴上创建列标题的折线图
- c# - 为什么我的并行任务代码不能达到 100% 的 CPU 利用率?
- c++ - 我可以在没有 Xcode 的 Mac 上使用 UnrealEngine 和 C++
- reactjs - 使用反应时将3d模型导入巴比伦
- postgresql - PL/pgSQL 函数中的语句是否按顺序运行?
- android - RXAndroid/RXJava2:链接三个改造请求并再次重复相同的过程
- python-requests - 我应该如何实现对响应生效的 Auth 处理程序?
- javascript - JavaScript - 如何为 GET 设置请求标头(真正的 GET,将您重定向到 url 的那个)