在C#下利用COM组件提供给第三方调用,无需强命名,通过CurrentDomain_AssemblyResolve方式的解决的过程

背景:

         因项目需要,在我们的系统中增加一个COM组件供第三方调用,这个DLL我们命名为:ShareUtilCOM.DLL(C#),他是一个COM组件,依赖SafeUtilCPlus.DLL(C++ CLR);SafeUtilCPlus.DLL主要是封装参数和加密算法;SafeUtilCPlus.DLL是通过C++ CLR编写,调用系统中的Core.util.DLL(C#);VS环境为VS2010;XP下,WIN7下均运行正常。

     

       一般情况下,对于ShareUtilCOM.DLL这个COM我们强签名后,通过regasm和gasutil后可以给第三方程序使用,但是强签名的DLL应用的所有DLL必须都要强签名,但是因为系统中依赖的DLL好多第三方库都没有强签名,所以我果断放弃了强签名的做法,转而寻求其他方法,最终通过CurrentDomain_AssemblyResolve方式实现了。

OKOK,不废话了,我们 现在来整理下

      第三方程序 我们叫:CallCom.exe;C#的COM组件叫:ShareUtilCOM.DLL,C++ CLR的DLL叫:SafeUtilCPlus.DLL,而核心的C#DLL叫:Core.util.DLL(C#)



其中SafeUtilCPlus.dll的配置

常规菜单:


ShareUtilCOM.DLL(C#)应用程序--》应用程序集

ShareUtilCOM.DLL(C#)生成



其他的均默认

ShareUtilCOM.DLL(C#)的

 [Guid("10B31ECF-9799-4A9C-AFBB-48C231CB3A55")]
    [ComDefaultInterface(typeof(IShareUtilCOM))]
    [ComSourceInterfaces(typeof(IShareUtilCOM))]
    public class ShareUtilCOM: IShareUtilCOM
    {
        static ShareUtilCOM()
        {
            //解决COM组件不进行强签名也可以调用的问题,调用程序必须要与本DLL在同一个目录下,而本DLL依赖的DLL可以通过如下方式来引入
            AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
        }

       
      //通过注册表获取业务系统路径,并将依赖的DLL通过Assembly.LoadFrom导入,注意不是LOADFILE

       private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
         {
             RegistryKey registryKeyNewApp= Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\myApp.exe", false);
             string path = "";
             if (registryKeyNewApp!= null)
             {
                 path = registryKeyNewApp.GetValue("Path").ToString();
                 path = path + @"\Bin\";
             }
             string strFielName = args.Name.Split(',')[0];
             path = string.Format(@"{0}{1}.dll", path, "SafeUtilCPlus");
             return Assembly.LoadFrom(path);
         }

      以下代码省略;


还有一点要非常注意,不要将ShareUtilCOM.DLL放到应用系统目录,不然无法触发CurrentDomain_AssemblyResolve;

最终目录结构应该是这样

业务系统下:

     ,C++ CLR的DLL叫:SafeUtilCPlus.DLL,而核心的C#DLL叫:Core.util.DLL(C#)

而第三方调用目录下:

   CallCom.exe;ShareUtilCOM.DLL;ShareUtilCOM.tlb; 在这个目录里用regasm来注册ShareUtilCOM.DLL,注册脚本如下:

请将下面代码放到BAT执行文件里去

set mypath=D:\project\testcom\
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe /u "%mypath%ShareUtilCOM.dll"
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe  "%mypath%ShareUtilCOM.dll" /tlb:ShareUtilCOM.tlb
pause

怎么调用COM组件,我就不写了,网上很多;


然后试试调用CallCom吧,看是否成功了!


另外推荐1个工具depends.exe,可以查看SafeUtilCPlus.DLL依赖的包,必须要解决这个DLL缺少的DLL才能正常运行;





  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在.NET开发中,使用currentdomain.assemblyresolve解决多个dll的方法有很多。currentdomain是AppDomain类的一个静态属性,可以用来获取当前应用程序域。 首先,我们可以使用Assembly类的Load方法来加载所需的dll。通过currentdomain.assemblyresolve事件,我们可以在应用程序域中自定义解决程序集的逻辑。当应用程序在加载一个程序集时找不到相应的dll文件时,就会触发这个事件。我们可以在事件处理程序中,通过逻辑来指定程序集的加载路径。 其次,我们还可以使用Assembly.LoadFrom方法来加载dll。这种方法不仅可以加载程序集,还可以解析程序集的依赖项。在currentdomain.assemblyresolve事件中,我们可以根据程序集的名称和路径,来自定义解析程序集依赖关系的逻辑。 另外,我们还可以使用AppDomain类的AppendPrivatePath方法来添加程序集的搜索路径。通过这个方法,我们可以额外指定其他dll文件所在的目录。在currentdomain.assemblyresolve事件中,我们可以根据dll文件的路径和名称,来自定义查找程序集所在目录的逻辑。 总之,使用currentdomain.assemblyresolve可以帮助我们解决多个dll的加载问题。通过事件处理程序中的自定义逻辑,我们可以指定程序集的加载路径,解析程序集的依赖关系,以及添加额外的程序集搜索路径。这样就能够确保应用程序能够正确加载和使用所需的dll文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值