zoukankan      html  css  js  c++  java
  • 在VBA中调用C#写成的DLL

    在项目中遇到客户的一个需求,
    需要在VBA中引用C#写成的DLL,并调用这个DLL中某个类的方法。
    VBA中计算得出的数据通过参数传给DLL

    经过调查,结论是:
    .net
    做出的dll不同于AxtiveX,是不能直接调用的。但可以转换成COM
    关于这个可以参照
    http://msdn2.microsoft.com/zh-cn/library/zsfww439.aspx

    最后的实现方法如下:
    1.        
    首先来编写能够被VBA调用的DLL,用Visual Studio创建一个ClassLibrary类型的project,步骤是New->Project->Visual C# Projects ->Class Library。将这个project命名为LMT_COMObject(举例说明,名字自己随便起)。
    2.        
    Project中写出的代码如下:

    Code


    3.在编译之前,要首先将我们写的这个COM object 注册为COM Interop,这里使用的是.NET提供的SN.EXE
    开始->运行->CMD,调出DOS窗口。
    DOS窗口中进入到刚刚建立的LMT_COMObject这个Project的根目录下。(例如C:"Documents and Settings"Administrator"Desktop"LMT"LMT_COMObject
    然后执行命令sn -k LMT_COM_Key.snk
    (
    注意,在执行此命令前,请确认你已经配置了.NET SDK Bin 的系统环境变量。
    配置方法: 在系统环境变量的Path中加入C:"Program Files"Microsoft Visual Studio .NET"FrameworkSDK"Bin)
    成功注册后,在LMT_COMObject这个Project的根目录下会生成一个名为LMT_COM_Key.snk的文件。
    4.
    打开LMT_COMObject这个ProjectAssemblyInfo.cs文件,
    做出如下修改
    [assembly: AssemblyKeyFile("LMT_COM_Key.snk")]
    5.
    配置LMT_COMObject这个Project的属性,打开Project属性窗口,在Configuration Properties中的Build里,将Register for COM interop设置为True
    6
    .编译LMT_COMObject这个Project。会在 LMT_COMObject"bin"Debug下面生成3个文件。
    LMT_COMObject.dll
    LMT_COMObject.pdbLMT_COMObject.tlbLMT_COMObject.tlb就是我们将来要在VBA中引用的,通过它就可以引用LMT_COMObject.dll
    7.
    下面介绍如何在VBA中引用这个DLL
    首先,建立一个Excel文件,插入一个名为CommandButton1button,双击此button添加事件,如下
    Private Sub CommandButton1_Click()
       
    End Sub
    打开VBA的编辑窗口(快捷键为ALT+F11),在菜单栏中,Tools->References,弹出References窗口,点击Browse,找到LMT_COMObject"bin"Debug路径下的LMT_COMObject.tlb这个文件,选择它,然后点OK
    此时已经成功引用到LMT_COMObject.dll
    8.
    VBAObject Browser中可以看到Library中有LMT_COMObjectClass名为LMT_ClassMemberLMT_test
    如果看到以上信息,那么,就可以在VBA中调用了。
    9.

    Private Sub CommandButton1_Click()
       
    End Sub
    加入调用,
    Dim lmt As New LMT_COMObject.LMT_Class
    Call lmt.LMT_test(result)
    写好的代码效果为
    复制内容到剪贴板代码:
    Private Sub CommandButton1_Click()
        Dim lmt As New LMT_COMObject.LMT_Class
        Call lmt.LMT_test(“string returned from VBA”)
    End Sub
    10.
    Excel中按下按CommandButton1,就会弹出窗体,显示string returned from VBA
    说明已经成功的在VBA中调用了LMT_COMObject.dllLMT_Class类中的LMT_test方法,并将一个string类型的参数传给了LMT_test方法,LMT_test方法执行的结果就是将这个string类型的参数的值通过弹出窗体给显示出来。
    有时出错须安装 vs2005-kb908002-enu-x86.exe
    下载地址:http://support.microsoft.com/kb/908002

    传给LMT_test方法的这个string类型的参数,可以是在VBA中按照业务逻辑计算出的结果,从而实现了上面说到的需求。

    转自:http://www.itpub.net/thread-945814-1-1.html

  • 相关阅读:
    CControlLayer
    CBiontCache
    CHero
    CWidgetMgr---cpp
    CWidgetMgr---H
    CXAnimation类
    CXAnimation.h动画类
    CXCommon.h工具类
    【leetcode】441. Arranging Coins
    【linux基础】关于ARM板子使用O3编译选项优化
  • 原文地址:https://www.cnblogs.com/yangbin1005/p/1415688.html
Copyright © 2011-2022 走看看