如何解决COM组件的.NET依赖关系?

如何解决COM组件的.NET依赖关系?,.net,com,c++-cli,dependency-management,assembly-resolution,.net,Com,C++ Cli,Dependency Management,Assembly Resolution,这是我当前的部署场景: 客户端应用程序部署在文件夹A中 COM DLL、C++/CLI包装DLL和.NET程序集部署在文件夹B中 DLL/程序集一起构成SDK,客户端应用程序是第三方使用者 这就是它的工作原理: 客户端应用程序启动并创建COM对象 客户端应用程序调用COM对象中的函数 COM对象将调用转发到C++/CLI包装DLL C++/CLI包装函数将调用转发到.NET程序集 问题:C++/CLI包装器找不到.NET程序集,应用程序崩溃 到目前为止,我能想到的解决方案有: 为.NE

这是我当前的部署场景:

  • 客户端应用程序部署在文件夹A中
  • COM DLL、C++/CLI包装DLL和.NET程序集部署在文件夹B中
  • DLL/程序集一起构成SDK,客户端应用程序是第三方使用者
这就是它的工作原理:

  • 客户端应用程序启动并创建COM对象
  • 客户端应用程序调用COM对象中的函数
  • COM对象将调用转发到C++/CLI包装DLL
  • C++/CLI包装函数将调用转发到.NET程序集
问题:C++/CLI包装器找不到.NET程序集,应用程序崩溃

到目前为止,我能想到的解决方案有:

  • 为.NET程序集指定一个强名称,并将其部署到GAC而不是文件夹B
  • 给客户端应用程序一个.config文件,并告诉它在文件夹B中查找程序集
  • 将某种自定义“解析器例程”添加到动态加载.NET程序集的C++/CLI包装中(类似于)
出于各种原因,这些解决方案似乎都不是特别有吸引力。你知道还有什么其他机制可以解决这个问题吗?理想的解决方案是在SDK端使用某种配置,但据我所知,无法为程序集提供.config文件,或者是


由于我不是特别精通.NET,我也非常感谢您对“解析器例程”解决方案的评论。这是人们经常做的事情,还是出于某种原因应该避免的异国情调?

在我看来,你所谓的“解析器例程”是最好的解决方案。由于程序集加载到默认上下文中,因此搜索路径包含客户端应用程序当前文件夹,而不是程序集的文件夹。 再次,这是使用AppDomain.AssemblyResolve事件的典型案例。 我想您可以将程序集加载到自定义上下文中,但对我来说这听起来有点太多了(只有我的两分钱)


我希望这能有所帮助

在我看来,您所谓的“解析器例程”是最好的解决方案。由于程序集加载到默认上下文中,因此搜索路径包含客户端应用程序当前文件夹,而不是程序集的文件夹。 再次,这是使用AppDomain.AssemblyResolve事件的典型案例。 我想您可以将程序集加载到自定义上下文中,但对我来说这听起来有点太多了(只有我的两分钱)


我希望这有助于

为什么C++/CLI包装器找不到.NET程序集?有什么错误?@SimonMourier错误是
FileNotFoundException
。发生这种情况的原因是.NET仅在文件夹A(应用程序的.exe文件所在的位置)和GAC中查找程序集。在C++/CLI包装器中,您可以钩住AssemblyResolve事件:并在运行时请求时指向.NET程序集。@SimonMourier Yep,这就是“解析器例程”的作用我提到的解决方案都是关于。我从我引用的SO答案中借用了这个术语(可能很不幸)。为什么C++/CLI包装器找不到.NET程序集?有什么错误?@SimonMourier错误是
FileNotFoundException
。发生这种情况的原因是.NET仅在文件夹A(应用程序的.exe文件所在的位置)和GAC中查找程序集。在C++/CLI包装器中,您可以钩住AssemblyResolve事件:并在运行时请求时指向.NET程序集。@SimonMourier Yep,这就是“解析器例程”的作用我提到的解决方案都是关于。我从我引用的答案中借用了这个——也许是不幸的——术语。