11

VS2005を使用して単純なC#DLL(これははるかに大きなプロジェクトの一部です)を作成しました。VBAコードを介してExcelでDLLを使用する必要があるため、アセンブリでCOM相互運用機能を使用しています。ビルドプロセスで必要なTLBファイルを自動的に生成するようにしようとしているので、コマンドラインに移動してビルドのたびにregasmを使用する必要はありません。

私の問題は、DLLは正常にコンパイルおよびビルドされますが、TLBファイルを生成しないことです。代わりに、タイトルのエラーが出力ボックスに出力されます。

VS2005->ビルド->出力->[ COM相互運用機能の登録]でプロジェクトのプロパティに移動して、TLBファイルをビルドする他のDLLを取得しました。また、AssemblyInfo.csに[assembly:ComVisible(true)]があります。

問題のあるDLLのソースと、リターンタイプとして参照するDLLの概要は次のとおりです。

using System;
using System.IO;
using System.Runtime.InteropServices;
using SymbolTable;

namespace ProblemLibrary
{
    public class Foo
    {    
        public Foo(string filename)
        {
            ...
        }

        // method to read a text file into a SymbolTable
        public SymbolTable BuildDataSet(string[] selected)
        {
            ...
        }
    }
}

これがSymbolTable.dllの要約です。これは、ProblemLibraryが使用する戻り型を保持します。

using System;
using System.Collections.Generic;

namespace SymbolTable
{
    public class SymbolTable
    {
        readonly Dictionary<SymbolInfoStub, string> _symbols = new Dictionary<SymbolInfoStub, string>();

       /*methods that interact with Dictionary snipped*/
    }
}
4

3 に答える 3

24
  1. パラメータなしでctorを使用する必要があります。
  2. クラスの周りにGuidAttributeProgIdAttributeが必要です。
  3. アセンブリをComVisible(false)としてマークし、エクスポートが必要なクラスを明示的にマークすることをお勧めします。
  4. クラスのインターフェースを使用します。
  5. アセンブリレベルにGuidAttributeがあることを確認してください。

    [Guid("<PUT-GUID-HERE-1>")]
    [ComVisible(true)]
    interface IFoo
    {
        void DoFoo();
    }
    
    [Guid("<PUT-GUID-HERE-2>")]
    [ComVisible(true)]
    [ProgId("ProgId.Foo")]
    class Foo : IFoo
    {
        public void DoFoo()
        {
        }
    }
    
于 2009-05-12T19:10:33.850 に答える
4

AssemblyInfo.csファイルで、次のものがあることを確認してください。

// Setting ComVisible to false makes the types in this assembly not visible 
// to COM components.  If you need to access a type in this assembly from 
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(true)]

アップデート:

読む:Excel VBA内から.NETオブジェクトを利用するにはどうすればよいですか?

リンク先: http: //richnewman.wordpress.com/2007/04/15/a-beginner%E2%80%99s-guide-to-calling-a-net-library-from-excel/

于 2009-05-12T18:43:00.960 に答える
3

同様の問題が発生しました。次のようなエラーが発生しました:

警告MSB3391:COM相互運用機能の登録を解除できるタイプは含まれていません。

すべてのルール(ComVisibleなど)に従いましたが、何も機能しませんでした。

解決策:最適化されないように、デフォルトのコンストラクターに何かを入れる必要がありました。そこに何かがあった瞬間、登録はメッセージなしで終了し、コンポーネントはレジストリに表示されました。

興味深いメモ:私の友人は、元のDLLを自分のマシン(64ビットWindows-7、VS2008-Professional、私のように)の空のデフォルトコンストラクターに登録することができました。ただし、彼のREGASM.EXEは次のとおりです。

C:\ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727 \ regasm.exe

私がいた間:

C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ RegAsm.exe

したがって、.NET Frameworkのバージョン間で多少の違いがある可能性があります。おそらく、後のバージョンでは最適化が多すぎて、REGASMはそれを考慮していません。

于 2011-03-02T23:28:28.837 に答える