Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为COM注册程序集时遇到问题_C#_Com_Registry_Class Library - Fatal编程技术网

C# 为COM注册程序集时遇到问题

C# 为COM注册程序集时遇到问题,c#,com,registry,class-library,C#,Com,Registry,Class Library,我在VisualStudio2008中创建了一个简单的类库项目,它有一个类,如下所示。我试图让这个类注册COM互操作,以便通过vbscript或jscript等非托管脚本在中使用 在我的项目构建属性中,我选中了“注册COM互操作”框 在程序集设置中,我选中了“使此程序集COM可见”,并确认Assembly.cs文件中存在[Assembly:ComVisible(true)]属性 每次生成此项目时,我都会收到一个错误,显示“projectname.dll不包含任何可注册用于COM互操作的类型。此外

我在VisualStudio2008中创建了一个简单的类库项目,它有一个类,如下所示。我试图让这个类注册COM互操作,以便通过vbscript或jscript等非托管脚本在中使用

在我的项目构建属性中,我选中了“注册COM互操作”框

在程序集设置中,我选中了“使此程序集COM可见”,并确认Assembly.cs文件中存在
[Assembly:ComVisible(true)]
属性

每次生成此项目时,我都会收到一个错误,显示“projectname.dll不包含任何可注册用于COM互操作的类型。此外,我还无法使用vbscript成功创建类1的实例。是否有人知道这没有正确注册

我的vbscript无法在此行创建activex对象…
Set F=CreateObject(“64BitCLTest.Class1”)

最后,我如何让VS在注册表的64位区域而不是32位区域注册它,以便64位进程可以使用它

-- The Test Class--
namespace _64BitCLTest
{
    [Guid("BBAA06EF-CA4C-4fe2-97CD-9B1D85ADA656")]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ComVisible(true)]
    [ProgId("64BitCLTest.Class1")]
    public class Class1
    {
        Class1()
        {
            // do nothing
        }

        public string Method1()
        {
            return "This is a return string from method 1";
        }

        public int Property1
        {
            get {return 777;}
        }
    }
}

您需要将构造函数标记为公共:

-- The Test Class--
namespace _64BitCLTest
{
    [Guid("BBAA06EF-CA4C-4fe2-97CD-9B1D85ADA656")]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ComVisible(true)]
    [ProgId("64BitCLTest.Class1")]
    public class Class1
    {
        public Class1()
        {
            // do nothing
        }

        public string Method1()
        {
            return "This is a return string from method 1";
        }

        public int Property1
        {
            get {return 777;}
        }
    }
}

这个答案有两个部分。第一,正如consultutah所说的问题是,我没有将构造函数标记为public

第二个答案是VS2008中有一个bug(我相信),它导致程序集永远不会在注册表的64位部分注册,即使安装项目是为x64的目标平台配置的


我安装了VS2010,重建了完全相同的项目并运行了安装。程序集注册得非常好,我能够使用64位进程通过COM成功地访问它。我仍然没有在VS2008中找到解决方案。

这很有效,但您知道如何让它注册此程序集,以便64位进程可以将其作为以及32位进程?目前我只能使用SysWOW64文件夹中的cscript创建它。您需要将其注册到64位版本的RegAsm:%SYSTEMROOT%\Microsoft.NET\Framework64\v2.0.50727\RegAsm.exe。老实说,我不知道如何使用csproj设置。我知道如何使安装程序执行自定义操作。是否可以调用R在我用作自定义操作的方法中使用C#代码生成的egAsm?我对自定义安装程序操作一无所知,但如果它只是一个常规的旧C#方法,则可以使用System.Diagnostics.Process.Start(“%SYSTEMROOT%\Microsoft.NET\Framework64\v2.0.50727\RegAsm.exe”,“参数转到此处”)有人建议我不要在客户端机器上这样做。我想在客户端机器上调用RegAsm是不好的。