最近在做一个项目,要在XSL文件里面调用C#写的一个DLL里面的函数
假设XSL文件跟DLL在一个路径下,调用DLL里面的Logic.Usp下的GetName()函数其中Logic是命名空间,Usp是类名最好能给出一个例子,谢谢您能帮忙。

解决方案 »

  1.   

    1. 封装.net的assembly
    定义一个接口,一个实现类。接口是为了导出TLB用的。
    给COM公开的方法都要加上[ComVisible(True)]的特性using System.IO;
    using System.Runtime.InteropServices;namespace CSCOMLib
    {
        [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
        [ComVisible(true)]
        public interface IDirectory4COM
        {
            string[] GetAllFiles(string directory);
            bool IsExistsDir(string directory);
        }    [Guid("9E5E5FB2-219D-4ee7-AB27-E4DBED8E123E"),ClassInterface(ClassInterfaceType.None)]
        [ComSourceInterfaces((typeof(IDirectory4COM)))]
        [ComVisible(true)]
        public class Directory4COM : IDirectory4COM
        {
            [ComVisible(true)]
            public string[] GetAllFiles(string directory)
            {
                return Directory.GetFiles(directory);
            }        [ComVisible(true)]
            public bool IsExistsDir(string directory)
            {
                return Directory.Exists(directory);
            }
        }
    }
    2. 使用 regasm.exe 包装注册这个.net的dll
    比如:E:\Program Files\Microsoft Visual Studio 9.0\VC>regasm.exe /codebase D:\VisualSt
    udioProject2008\CSCOMLib\bin\Debug\CSCOMLib.dll上面这样封装因为不是强命名的assembly,执行注册会有警告。注意这里用的是 /codebase 参数,因为没有注册强名的assembly也就是不放在全局程序集缓存里,/codebase默认将当前路径的dll注册进去。也就是这个路径变了的话,COM就找不到实现了。3. 测试,同一路径下创建个.xls(excel文件)
    在某个sheet上拖个button,点击进去创建测试代码。
    先引用(工具->引用)CSCOMLib。测试代码如下,测试用例很简单:在C2单元格内输入要参看的目录路径,
    按下按钮则将路径下所有文件取出。测试一下OK。Private Sub CommandButton1_Click()    Dim strDir As String
        Dim strFiles() As String
        Dim objDirectory As CSCOMLib.Directory4COM
        Set objDirectory = New CSCOMLib.Directory4COM
        
        strDir = Range("C2")
        If Not objDirectory.IsExistsDir(strDir) Then
            MsgBox "Please input available directory"
            Exit Sub
        End If
        
        strFiles = objDirectory.GetAllFiles(strDir)
        
        Dim intIdx As Integer
        For intIdx = 1 To UBound(strFiles)
            Range("C" & CStr(2 + intIdx)) = strFiles(intIdx)
        Next
         
    End Sub