[英].NET6: registering COM DLL with regsvr32 results in 80040111
[英]How do I register a .NET COM DLL with Regsvr32?
我有一个使用 COM DLL 的 VB6 应用程序。 DLL 是用 C# 编写的。 在 C# 项目属性中,我选中了“注册 COM 互操作”选项。 VB6 应用程序在我的开发机器上运行良好。 C# 代码完全遵循以下格式: CodeProject C# COM 示例
部署到其他机器时,Regsvr32.exe 在我尝试注册 DLL 时出现以下错误:
The module "MyCOM.dll" was loaded but the entry-point DLLRegisterServer was not found.
这是什么意思? 我读过的有关 COM DLL 的教程/文档中没有提到“入口点 DLLRegisterServer”。
我们在不同的机器上使用 RegAsm.exe 遇到了重大问题,所以我们真的需要一个解决方案,我们可以运行 regsvr32.exe 而不是我们部署到的任何机器(即 XP、Vista、Windows 7、x86 机器、x64机器等)
我需要在我的 C# 代码中添加什么才能使其可通过 regsvr32.exe 注册?
你不能。 托管 [ComVisible] 类库需要使用 Regasm.exe 进行注册。
您可以在 IDE 中使用 Project + Properties、Build 选项卡、Register for COM interop 复选框执行此操作。 如果您运行 Regasm.exe,您通常需要 /codebase 命令行选项,这样您就不必将程序集放在 GAC 中。 另一种选择是让 Regasm.exe 使用 /regfile 选项生成一个 .reg 文件。 您只需在目标机器上运行它即可更新注册表。
编辑:刚刚看到“主要问题”的评论。 请注意它们是什么,来自 /codebase 的缩写。 您必须在 64 位机器上选择正确的版本。 那里有两个。 而且您需要一个提升的命令提示符,以便 UAC 不会阻止它。
您可以制作一个简单的 Windows 应用程序并使用下面的代码来注册 COM DLL。 确保添加清单文件以管理员身份运行:
...
namespace comregister
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string framework = Environment.GetEnvironmentVariable("SystemRoot") + @"\Microsoft.NET\Framework\v2.0.50727\";
private void button1_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
textBox1.Text = openFileDialog1.FileName;
button2.Enabled = true;
button3.Enabled = true;
}
}
private void button2_Click(object sender, EventArgs e)
{
FileInfo fi = new FileInfo(textBox1.Text);
string fn = fi.FullName.Substring(0, fi.FullName.Length - 4);
string dll = "\"" + fi.FullName + "\"";
string tlb = "\"" + fn + ".tlb\"";
Process p = new Process();
p.StartInfo.FileName = framework + "regasm.exe";
p.StartInfo.Arguments = dll + " /tlb:" + tlb + " /codebase";
p.Start();
p.WaitForExit();
label2.Text = "registered";
}
private void button3_Click(object sender, EventArgs e)
{
FileInfo fi = new FileInfo(textBox1.Text);
string dll = "\"" + fi.FullName + "\"";
Process p = new Process();
p.StartInfo.FileName = framework + "regasm.exe";
p.StartInfo.Arguments = dll + " /unregister";
p.Start();
p.WaitForExit();
label2.Text = "unregistered";
}
private void button4_Click(object sender, EventArgs e)
{
Application.Exit();
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.