I have a VB6 application that uses a COM DLL. The DLL is written in C#. In the C# project properties I have the "Register for COM interop" option checked. The VB6 app works fine on my development machine. The C# code follows this format exactly: CodeProject C# COM Example
When deploying to other machines, Regsvr32.exe gives me the following error when I try to register the DLL:
The module "MyCOM.dll" was loaded but the entry-point DLLRegisterServer was not found.
What does this mean? No tutorials/documentation I've read about COM DLLs say anything about "entry-point DLLRegisterServer".
We have had MAJOR problems using RegAsm.exe on different machines, so we really need a solution where we can run regsvr32.exe instead that will work for any machine that we deploy to (i.e. XP, Vista, Windows 7, x86 machines, x64 machines, etc.)
What do I need to add to my C# code to make it register-able with regsvr32.exe?
You can't. Managed [ComVisible] class libraries need to be registered with Regasm.exe.
You can do it from the IDE with Project + Properties, Build tab, Register for COM interop checkbox. If you run Regasm.exe you usually want the /codebase command line option so you don't have to put the assembly in the GAC. Yet another option is to let Regasm.exe generate a .reg file with the /regfile option. You'd just run that on the target machine to get the registry updated.
Edit: just saw the "major problems" remark. Note sure what they are, short from /codebase. You do have to pick the right version on 64-bit machines. There are two. And you need an elevated command prompt so that UAC don't put a stop to it.
You can make a simple Windows application and use the code below to register COM DLL. Make sure to add the manifest file to run as Administrator:
...
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();
}
}
}