web-dev-qa-db-ja.com

.NET COM DLLをRegsvr32に登録するにはどうすればよいですか?

COMDLLを使用するVB6アプリケーションがあります。 DLLはC#で記述されています。C#プロジェクトのプロパティで、[COM相互運用機能に登録]オプションがオンになっています。VB6アプリは開発マシンで正常に動作します。C#コードはこの形式に正確に従います。 : CodeProject C#COMの例

他のマシンにデプロイする場合、DLLを登録しようとすると、Regsvr32.exeで次のエラーが発生します。

The module "MyCOM.dll" was loaded but the entry-point DLLRegisterServer was not found.

これは何を意味するのでしょうか? COM DLLについて読んだチュートリアル/ドキュメントは、「エントリポイントDLLRegisterServer」について何も言っていません。

さまざまなマシンでRegAsm.exeを使用すると大きな問題が発生したため、デプロイ先のすべてのマシン(XP、Vista、Windows 7、x86マシン、x64など)で機能する代わりに、PASSWORD32.exeを実行できるソリューションが本当に必要です。機械等)

PASSWORD32.exeに登録できるようにするには、C#コードに何を追加する必要がありますか?

15
Mike Webb

できません。マネージド[ComVisible]クラスライブラリはRegasm.exeに登録する必要があります。

IDE [プロジェクト+プロパティ]、[ビルド]タブ、[COM相互運用機能に登録]チェックボックスを使用)から実行できます。Regasm.exeを実行する場合は、通常/ codebaseコマンドラインオプションが必要なので、必要ありません。アセンブリをGACに配置する必要があります。さらに別のオプションは、Regasm.exeに/ regfileオプションを使用して.regファイルを生成させることです。これをターゲットマシンで実行して、レジストリを更新します。

編集:「主要な問題」の発言を見たところです。/codebaseから短くしてそれらが何であるかを確認してください。 64ビットマシンでは適切なバージョンを選択する必要があります。二つあります。また、UACが停止しないように、昇格されたコマンドプロンプトが必要です。

19
Hans Passant

簡単なWindowsアプリケーションを作成し、以下のコードを使用してCOMDLLを登録できます。管理者として実行するマニフェストファイルを必ず追加してください。

...

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();
        }
    }
}
0
user3806621