C# 为COM注册程序集时遇到问题
我在VisualStudio2008中创建了一个简单的类库项目,它有一个类,如下所示。我试图让这个类注册COM互操作,以便通过vbscript或jscript等非托管脚本在中使用 在我的项目构建属性中,我选中了“注册COM互操作”框 在程序集设置中,我选中了“使此程序集COM可见”,并确认Assembly.cs文件中存在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互操作的类型。此外
[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是不好的。