注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

hurt0759的个人主页

人生常态--跋涉.人生暂态--歇息.

 
 
 

日志

 
 

VBA中调用C#生成的DLL 转  

2011-11-21 15:46:04|  分类: IT |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

开发环境:VS2005 + OFFICE2003

一 用C#编写DLL程序

1)编写DLL程序

VBA中调用C生成的DLL 转 - michael - hurt0759的个人主页

using System;
using System.IO;
using System.Xml;
using System.Text;
using System.Runtime.InteropServices;
using System.Collections;

namespace Common
VBA中调用C生成的DLL 转 - michael - hurt0759的个人主页
{
    [Guid(
"694C1820-04B6-4988-928F-FD858B95C880")]
VBA中调用C生成的DLL 转 - michael - hurt0759的个人主页    
/// <summary>
    
/// XML生成
    
/// </summary>

    public interface XmlEvent_Interface
VBA中调用C生成的DLL 转 - michael - hurt0759的个人主页    
{
        [DispId(
1)]
        
int DataWrite(String filePath, String serviceID, ref String[] tag);
        [DispId(
2)]
        String[] DataRead(String filePath);

    }


    
// Events interface Database_COMObjectEvents 
    [Guid("47C976E0-C208-4740-AC42-41212D3C34F0"),
    InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    
public interface XmlEvent_Events
VBA中调用C生成的DLL 转 - michael - hurt0759的个人主页    
{
    }


    [Guid(
"9E5E5FB2-219D-4ee7-AB27-E4DBED8E123E"),
    ClassInterface(ClassInterfaceType.None),
    ComSourceInterfaces(
typeof(XmlEvent_Events))]
VBA中调用C生成的DLL 转 - michael - hurt0759的个人主页    
/// <summary>
    
/// XML生成
    
/// </summary>

    public class XmlEvent : XmlEvent_Interface
VBA中调用C生成的DLL 转 - michael - hurt0759的个人主页    
{
        
public XmlEvent()
VBA中调用C生成的DLL 转 - michael - hurt0759的个人主页        
{
        }



        
public int DataWrite(String filePath, String serviceID, ref String[] tag)
VBA中调用C生成的DLL 转 - michael - hurt0759的个人主页        
{
             
//Do Something;
        }



        
public String[] DataRead(String filePath)
VBA中调用C生成的DLL 转 - michael - hurt0759的个人主页        
{
            
//Do Something;
        }

    }

}


2)项目属性配置

打开Project属性窗口,在Build选项中,将Register for COM interop设置为True。

注:有了这个设定,在EXCEL中才能看到DLL中的方法

3)使用签名
打开Project属性窗口,在签名选项中,新建一个后缀名为.snk的签名文件既可,3> 在工程中的 AssemblyInfo.cs 文件中修改[assembly: ComVisible(true)]//原来默认为false

注:没有签名的话,使用上没有问题,只是在注册DLL的时候会出现警告.

4)编译既可生成Common.dll和Common.tlb的文件.

二 在VBA中调用DLL

1)引用设定

打开VBA的编辑窗口(快捷键为ALT+F11),在菜单栏中,Tools->References,弹出References窗口,

点击Browse,找到Common.tlb这个文件,选择它,然后点OK。此时已经成功引用到Common.dll。

在VBA的Object Browser中可以看到Library中有Common.
如果看到以上信息,那么,就可以在VBA中调用了。

2)编写VBA

VBA中调用C生成的DLL 转 - michael - hurt0759的个人主页
Dim obj As New Common.XmlEvent
obj.DataWrite(strXml, strServiceID, strdata)

到此,已经成功的从VBA中调用了C#DLL中的方法.

三 要注意的问题
1)DLL注册问题

直接编译程序,会自动注册你所编写的DLL的

但是如果你已经发布到客户端了,客户端没有IDE怎么办呢?

这时候就需要用到命令行来注册这个DLL.

写个Bat文件.比如RegCommon.bat,具体命令如下:

path %path%;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\;
regasm Common.dll /codebas

这里主要就是用了regasm这个命令,为了执行方便,所以在第一行对Path做了修正.

把这个bat文件放到和dll文件在一个目录下执行一下,就OK了.

 2)补丁问题

如果你按我上边说的,从VBA调用DLL时,出错的话,尝试一下打下面的补丁

vs2005-kb908002-enu-x86.exe 

参照及下载地址:http://support.microsoft.com/kb/908002/

  评论这张
 
阅读(1569)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017