簡體   English   中英

如何使用 Regsvr32 注冊 .NET COM DLL?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM