excel 我如何公开一个C# XLL方法以便从MySQL调用?

gorkyyrv  于 11个月前  发布在  C#
关注(0)|答案(1)|浏览(82)

我在这里看过类似的答案,但没有一个能完全回答我的问题。
我有一个C# XLL,它包含一个UDF(由ExcelDNA提供支持)和一些帮助类和方法-其中之一是这个:

namespace Data_Tool
{
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    public class DataCache
    {
        public static Dictionary<string, DataCache> calcs = new Dictionary<string, DataCache> { };
        
        string filepath;
        object[,] data;

        // Class constructor
        public DataCache(string filepath)
        {
            this.filepath = filepath;
            this.data = new object[,] { };
        }
        
        public static void RemoveCache(string filename)
        { // This allows an external entity to call and remove cached data for a particular file
            if (calcs.ContainsKey(filename)) calcs.Remove(filename);
        }
    }
}

字符串
我尝试做的是在Excel中使用一个事件处理程序(BeforeClose事件)来触发上面的最后一个方法(RemoveCache)-目的是在文件关闭时从'calcs'字典中删除缓存的项目。我的JavaScript代码尝试像这样MapXLL函数,但我总是在尝试执行时得到一个入口点未找到的错误:

#If Win64 Then
    Declare PtrSafe Sub RemoveCache Lib "DataTool-AddIn64.xll" (filename As String)
#Else
    Declare PtrSafe Sub RemoveCache Lib "DataTool-AddIn.xll" (filename As String)
#End If

Public Sub test()
    RemoveCache ThisWorkbook.FullName
End Sub


你会看到,在我的C#天真,我试图使用ComVisible暴露RemoveCache方法COM -但显然这是不正确的。我不太确定如何更改我的代码,使RemoveCache可从COM调用。

0md85ypi

0md85ypi1#

我发现了一个稍微有点古怪的解决方案-因为我已经在使用ExcelDNA在同一个XLL中生成了一些UDF,我刚刚做了一个名为RemoveCache的void函数,它可以执行相同的操作-或者实际上只是为我调用C#中的方法。这允许我使用Application.Run在JavaScript中调用该函数:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    On Error Resume Next ' Set to skip if the DataTool add-in is not present
    Application.Run "RemoveCache", ThisWorkbook.FullName
End Sub

字符串
然后我的C#中的UDF代码是:

[ExcelFunction(Description = "Erase cache item", IsMacroType = true)]
public static void RemoveCache(string filename)
{
    DataCache.RemoveCacheItem(filename);
}


其中RemoveCacheItem是我在DataCache类中重命名的方法,来自我最初的问题。
使用这种方法是否有任何陷阱,因为它很简单,所以我喜欢它?

相关问题