我正在创建一个名为MyExcelFunctions的类库。以下是用C#编写的所有代码:
namespace MyExcelFunctions
{
public interface IFunctions { string OddOrEven(int number); }
[ComDefaultInterface(typeof(IFunctions))]
public class Functions : IFunctions
{
public string OddOrEven(int number)
{
return number % 2 == 0 ? "Even" : "Odd";
}
private static string GetSubKeyName(Type type)
{
string s = @"CLSID\{" + type.GUID.ToString().ToUpper() + @"}\Programmable";
return s;
}
[ComRegisterFunction]
public static void RegisterFunction(Type type)
{
Registry.ClassesRoot.CreateSubKey(GetSubKeyName(type));
}
[ComUnregisterFunction]
public static void UnregisterFunction(Type type)
{
Registry.ClassesRoot.DeleteSubKey(GetSubKeyName(type));
}
}
}
我正在编译此项目并将程序集(.dll文件)添加到Excel。
(Excel选项 - >加载项 - >管理[Excel加载项] - >转到... - >自动化... - >浏览...)。
但是得到以下错误:
我尝试以管理员身份添加,但没有成功。我做错了什么?
我发现了这种情况here
答案 0 :(得分:0)
我解决了这个问题。我上面所做的一切都是正确的,除了我必须用ComVisible(true)
标记类。这是更正后的代码。
namespace MyExcelFunctions
{
[ComVisible(true)]
public interface IFunctions { string OddOrEven(int number); }
[ComVisible(true)]
[ComDefaultInterface(typeof(IFunctions))]
public class Functions : IFunctions
{
public string OddOrEven(int number)
{
return number % 2 == 0 ? "Even" : "Odd";
}
private static string GetSubKeyName(Type type)
{
string s = @"CLSID\{" + type.GUID.ToString().ToUpper() + @"}\Programmable";
return s;
}
[ComRegisterFunction]
public static void RegisterFunction(Type type)
{
Registry.ClassesRoot.CreateSubKey(GetSubKeyName(type));
}
[ComUnregisterFunction]
public static void UnregisterFunction(Type type)
{
Registry.ClassesRoot.DeleteSubKey(GetSubKeyName(type));
}
}
}
然后必须使用RegAsm.exe实用程序注册程序集。
首先必须重建项目。之后,必须将重新生成的组件保存在目标机器上。我将其保存在C:\ProgramFiles\MyExcelAddin
文件夹中(必须创建)。另外,我将RegAsm.exe复制到同一个文件夹中。它位于C:\Windows\Microsoft.Net\Framework\v4.0.30319
。最后,必须运行具有管理权限的命令提示符并进入MyExcelAddin
文件夹。键入的命令是RegAsm /codebase ClassLibraryName.dll
完成这些步骤后,该类将显示在Excel中的“自动化服务器”列表中。我们现在要做的就是选择它并按OK按钮。
上面创建的方法可以用作单元格中的公式。
我希望这会对某人有所帮助。