首先要解决com组件的版本问题,这就要求我们不直接使用clsid,而用ProgId来代替客户机上的com组件就可以解决相当程度的问题了,就是这么简单。
至于如何才能把那个可恶的dll文件给去掉,这就需要利用dotNet提供的反射功能了,我们一代码为例,这里我们假设有一个ProgId为"ReflectionCom.TestObj"的com组件,这个组件有唯一一个方法string SayHello(string AName):
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMDV2Ym1VdVoybG0%3D.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMDV2Ym1VdVoybG0%3D.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMDV2Ym1VdVoybG0%3D.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMDV2Ym1VdVoybG0%3D.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMFY0Y0dGdVpHVmtRbXh2WTJ0VGRHRnlkQzVuYVdZPQ%3D%3D.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMME52Ym5SeVlXTjBaV1JDYkc5amF5NW5hV1k9.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OWtiM1F1WjJsbQ%3D%3D.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMGx1UW14dlkyc3VaMmxt.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMFY0Y0dGdVpHVmtVM1ZpUW14dlkydFRkR0Z5ZEM1bmFXWT0%3D.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMME52Ym5SeVlXTjBaV1JUZFdKQ2JHOWpheTVuYVdZPQ%3D%3D.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OWtiM1F1WjJsbQ%3D%3D.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMGx1UW14dlkyc3VaMmxt.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMFY0Y0dGdVpHVmtVM1ZpUW14dlkydFRkR0Z5ZEM1bmFXWT0%3D.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMME52Ym5SeVlXTjBaV1JUZFdKQ2JHOWpheTVuYVdZPQ%3D%3D.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OWtiM1F1WjJsbQ%3D%3D.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMFY0Y0dGdVpHVmtVM1ZpUW14dlkydFRkR0Z5ZEM1bmFXWT0%3D.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMME52Ym5SeVlXTjBaV1JUZFdKQ2JHOWpheTVuYVdZPQ%3D%3D.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OWtiM1F1WjJsbQ%3D%3D.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMGx1UW14dlkyc3VaMmxt.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMGx1UW14dlkyc3VaMmxt.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMGx1UW14dlkyc3VaMmxt.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMGx1UW14dlkyc3VaMmxt.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMGx1UW14dlkyc3VaMmxt.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMGx1UW14dlkyc3VaMmxt.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMGx1UW14dlkyc3VaMmxt.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMGx1UW14dlkyc3VaMmxt.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMFY0Y0dGdVpHVmtVM1ZpUW14dlkydEZibVF1WjJsbQ%3D%3D.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMFY0Y0dGdVpHVmtVM1ZpUW14dlkydEZibVF1WjJsbQ%3D%3D.jpg?w=700&webp=1)
![[C#]利用反射调用COM组件 [C#]利用反射调用COM组件](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9MMGx0WVdkbGN5OVBkWFJzYVc1cGJtZEpibVJwWTJGMGIzSnpMMFY0Y0dGdVpHVmtRbXh2WTJ0RmJtUXVaMmxt.jpg?w=700&webp=1)
不过我们要看到这种方法的不足,由于这里用了迟绑定,因此我们无法让编译器做任何的类型检查工作,因此只有在运行时才能知道程序对错;而且,可以以这种方法调用的com组件必须实现IDispatch接口,也就是说必须是一个自动化组件,假如你要调用的组件是一个普通的com组件的话,那就一边哭去吧!呵呵