C# 无法在64位应用程序内的VBA中实例化使用Visual Studio 2008生成的COM库

C# 无法在64位应用程序内的VBA中实例化使用Visual Studio 2008生成的COM库,c#,.net,com,excel-2010,C#,.net,Com,Excel 2010,我试图建立一个对象库,可以注册和使用VBA使用64位excel 2010。我正在使用devstudio2008。我认为这是一个64位的问题,因为当我用我以前版本的Excel(XP)尝试它时,我非常确定这是有效的。我已在程序集信息对话框中单击“使COM可见”,并在生成标记中单击“注册COM互操作”。当我将目标类型设置为x64时,在“引用”对话框中根本看不到库。如果我选择了任何一个CPU,我都可以注册它,但当我尝试实例化它时,会出现“无法创建活动X对象”错误 namespace Tester {

我试图建立一个对象库,可以注册和使用VBA使用64位excel 2010。我正在使用devstudio2008。我认为这是一个64位的问题,因为当我用我以前版本的Excel(XP)尝试它时,我非常确定这是有效的。我已在程序集信息对话框中单击“使COM可见”,并在生成标记中单击“注册COM互操作”。当我将目标类型设置为x64时,在“引用”对话框中根本看不到库。如果我选择了任何一个CPU,我都可以注册它,但当我尝试实例化它时,会出现“无法创建活动X对象”错误

namespace Tester
{
    [Guid("D6F88E95-8A27-4ae6-B6DE-0542A0FC7039")]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface _Numbers
    {       
        int GetDay();
        int GetMonth();
        int GetYear();
        int DayOfYear();
    }

    [Guid("13FE32AD-4BF8-495f-AB4D-6C61BD463EA4")]
    [ClassInterface(ClassInterfaceType.None)]
    [ProgId("Tester.Numbers")]
    public class Numbers : _Numbers
    {
        public Numbers(){}

        public int GetDay()
        {
            return(DateTime.Today.Day);
        }

        public int GetMonth()
        {
            return(DateTime.Today.Month);
        }

        public int GetYear()
        {
            return(DateTime.Today.Year);
        }

        public int DayOfYear()
        {
            return(DateTime.Now.DayOfYear);
        }
    }
}

由于Visual Studio是一个32位进程,它将错误地运行的32位版本以注册64位程序集。当然,该版本的regasm.exe将写入注册表的32位部分,因此无法工作

解决此问题的一种方法是自己在目标程序集上运行64位版本的
regasm.exe
(例如,在生成后步骤中)。您需要使用
/tlb
选项导出其类型库,并且还需要传递
/codebase
选项,因为程序集不在GAC中:

"%SystemRoot%\Microsoft.NET\Framework64\v2.0.50727\regasm.exe"
    /tlb /codebase "$(TargetPath)"

由于Visual Studio是一个32位进程,它将错误地运行的32位版本以注册64位程序集。当然,该版本的regasm.exe将写入注册表的32位部分,因此无法工作

解决此问题的一种方法是自己在目标程序集上运行64位版本的
regasm.exe
(例如,在生成后步骤中)。您需要使用
/tlb
选项导出其类型库,并且还需要传递
/codebase
选项,因为程序集不在GAC中:

"%SystemRoot%\Microsoft.NET\Framework64\v2.0.50727\regasm.exe"
    /tlb /codebase "$(TargetPath)"

是否可以尝试在程序集上手动运行64位版本的
regasm.exe
,看看它是否解决了问题?使用64位版本的regasm应该是此处提到的解决方案:但没有提到,如果要从VBA引用它,则需要通过/tlb:导出类型库。但是,当我使用64位版本的regasm在64位构建上执行此操作时,我现在发现错误“自动化错误:系统找不到指定的文件”刚刚开始工作-您还需要添加/codebase标志,因此完整的命令行是regasm/codebase/tlb:。如果你想把所有相关的信息都写进答案,我会接受的,它可能会帮助其他人。您是否可以尝试在程序集上手动运行64位版本的
regasm.exe
,看看它是否解决了问题?使用64位版本的regasm应该是此处提到的解决方案:但没有提到,如果要从VBA引用它,则需要通过/tlb:导出类型库。但是,当我使用64位版本的regasm在64位构建上执行此操作时,我现在发现错误“自动化错误:系统找不到指定的文件”刚刚开始工作-您还需要添加/codebase标志,因此完整的命令行是regasm/codebase/tlb:。如果你想把所有相关信息放在一个答案中,我会接受它,它可能会帮助其他人。