Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2018年10月06日] [更新 2018年10月08日] Delphi 一般・その他
   
C# で作成した DLL を Delphi で使用 - COM 参照
動作確認等 Microsoft Visual Studio Express 2013 for Windows Desktop
Windows 7 U64(SP1) + Delphi XE5(UP2) Pro VCL-32
[整理番号 - 0300]







01_C# で作成した DLL を COM 参照によって Delphi で使用する


C# は .NET Framework 用の開発言語です.C# で作成した DLL は,そのままでは Delphi からは使用できませんが,DLL のソースコードがあれば,COM 参照関係の設定を追加することによって,DLL 内のクラスを COM オブジェクトとして操作するようにできます.
本ページはその手順についての記事です.
この記事では,Microsoft Visual Studio Express 2013 for Windows Desktop を使用して C# の DLL を作成する手順を説明しています.

DLL のソースコードない場合については,以下のリンクの記事を参考にしてください.






02_C# の DLL に COM インターフェイス用のコードを追加
Usage_dotNETDll.zip [901 KB] 2018年10月04日版(EXE 同梱)


上の ZIP ファイルには Visual Studio Express 2013 for Windows Desktop で作成した C# の DLL のプロジェクトが含まれています.このプロジェクトは,対象フレームワークを.NET Framework 4.5 としています.
Visual Studio の IDE を管理者権限 (管理者として実行) で起動して,[ファイル] [プロジェクトを開く] で [csSimpleDLL] フォルダ内のファイル csSimpleDLL.csproj を開きます.これがプロジェクトファイルです.

IDE の右ペインの [ソリューションエクスプローラー] の CalcFuncsClass.cs をダブルクリックして表示します.これが DLL のソースコードです.



図1
管理者権限で起動

下のコードが元の DLL のコードです.



リスト1
元の DLL のコードで,.NET Framework の開発用言語専用の DLL のコード
// ファイル名 : CalcFuncsClass.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace csSimpleDLL
{
    public class CalcFuncs
    {
        public String GetText()
        {
            return "日本語 ABC 文字列";
        }
        public int AddInt(int AInt1, int AInt2)
        {
            return AInt1 + AInt2;
        }
    }
}


以下のコードが変更後の DLL のコードです.
using System.Runtime.InteropServices を追加して,クラスの定義の前にインターフェイス関係のコードを追加しています.クラスの定義文には : (コロン) とインターフェイス名を追加しています.関数類のコードは元のままです.

ここではインターフェイス名を,クラス名の先頭に I を付けた ICalcFuncs としました.インターフェイス名のプリフィックス (先頭の文字) は慣習的に I を使用します.ProgId は任意ですが,ここでは,名前空間.クラス名としています.
GUID は COM オブジェクトを一意に認識するための識別子です.他で使用している値は使用できません.GUID 生成ツール等を使用して生成します.

クラス名が添付のプロジェクト名と同じになっていますが,DLL 内のクラスは複数存在することもありますから,別の名前にした方がいいかも知れません.
インターフェイスの設定はクラスごとに必要です.



[備考]
DLL 内のクラスのオブジェクトを CreateOleObject 関数で生成して,OleVariant 型で扱う場合は,以下のようなコードの変更は必要ありません.元の DLL のコードのままで構いません.
後述の [タイプライブラリの取り込みなしで C# の DLL を使用する方法] も参考にしてください.



リスト2
COM インターフェイス関係のコードを追加した変更後の DLL のコード
// ファイル名 : CalcFuncsClass.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

namespace csSimpleDLL
{
    //--------------------------------------------------------------------
    //  インターフェイスの定義 (dispinterface) 用のコード
    //  元の DLL のコードに追加した部分
    //--------------------------------------------------------------------
    [Guid("3C809CC0-E8C6-408C-8843-F290F38E54B3")]
    public interface ICalcFuncs
    {
        // 使用する関数類を列挙
        String GetText();
        int AddInt(int AInt1, int AInt2);
    }

    //--------------------------------------------------------------------
    //  interface(IDispatch) の定義部分
    //  元の DLL のコードに追加した部分
    //--------------------------------------------------------------------
    [ClassInterface(ClassInterfaceType.None)]
    [ProgId("csSimpleDLL.CalcFuncs")]
    [Guid("B835F7A6-B8E3-4336-9010-0BAFE7EE4DED")]

    //--------------------------------------------------------------------
    //  クラス名の後にインターフェイス名を付加
    //  それ以外は元の DLL のコードと同じ
    //--------------------------------------------------------------------
    public class CalcFuncs : ICalcFuncs
    {
        public String GetText()
        {
            return "日本語 ABC 文字列";
        }
        public int AddInt(int AInt1, int AInt2)
        {
            return AInt1 + AInt2;
        }
    }
}


GUID は Visual Studio の [ツール] [GUID の作成] で表示されるダイアログで作成できます.



図2
GUID の作成ツール
  • コピーして利用する




03_C# の DLL を COM 参照可能にする設定


COM は,アプリケーション間の通信手段を提供する仕組みです.
DLL 内のクラスを COM オブジェクトとして外部から参照可能にするために,DLL のプロジェクトのオプション等を変更します.COM の参照関係の設定をしないと,DLL 内のクラスを外部のプログラムからは参照できません.

まず [プロジェクト] [XXXX のオプション] で左ペインの [アプリケーション] を選択します.そして [アセンブリ情報] ボタンをクリックすると下図のダイアログが表示されます.
このダイアログで [アセンブリを COM 参照可能にする] をチェックします.アセンブリは DLL, EXE 等のことです.

このダイアログの [タイトル] を変更すると,タイプライブラリの取り込みのダイアログでの表示を変更することができます.添付のプロジェクトではデフォルトであるプロジェクト名のままです.



図3
アセンブリ情報の設定
  • [アセンブリを COM 参照可能にする] をチェック
  • 他の項目の設定は任意

上のダイアログを [OK] ボタンで閉じたら左ペインの [ビルド] を選択します.そして [構成] つまりビルド構成を Release にして [COM 相互運用機能を登録] をチェックします.
この設定をしたらこのタブは閉じても構いません.



図4
ビルド関係の設定
  • 構成を Release にする
  • [COM 相互運用機能を登録] をチェックする

次にメニューの [ビルド] から [構成マネージャー] をクリックして下図のダイアログを表示します.このダイアログの [アクティブソリューション構成] を Release にします.Release にしておかないと,ビルドした時に DLL の登録とタイプライブラリファイルの作成を自動で実行してくれません.



図5
構成マネージャーの設定
  • [アクティブソリューション構成] を Release にする

次に IDE [ソリューションエクスプローラー] の [Properties] 階層下の [AssemblyInfo.cs] をダブルクリックしてそのコードを表示します.そのコード内の ComVisible の ( ) 内の値が true になっていることを確認します.false になっていたら true に変更します.
Visual Studio Express 2013 では,この値のデフォルトは true です.



リスト3
ComVisible の値が true になっていることを確認する
// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから 
// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、
// その型の ComVisible 属性を true に設定してください。
[assembly: ComVisible(true)]

// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です
[assembly: Guid("0f9e203f-ff6c-47bb-878f-db6428fefcaf")]




04_DLL を任意の場所に配置できるように厳密な名前を設定


次に DLL に厳密な名前を設定します.この設定は必須というわけではありません.

本ページの設定と方法で Visual Studio を使用して DLL を作成する環境では,どのフォルダ内の EXE からも DLL を利用できます.しかし,.NET Framework の開発言語で作成した DLL は,基本的には EXE と同じ場所にある時に利用可能になっています.
本項の方法で署名をしておくと,他のコンピュータに DLL を登録する際,任意の場所からその DLL を認識できるようにすることができます.

[プロジェクト] [XXXX のオプション] で左ペインの [署名] を選択します.[アセンブリに署名する] をチェックするとその下のコンボボックスが操作できます.そのコンボボックスで [<新規作成>] を選択してダイアログを表示します.



図6
[アセンブリに署名する] をチェックして新規作成

ダイアログの [キーファイル] の入力欄に適当な名前を入力します.ここでは csSimpleDLLKey としました.ダイアログを [OK] で閉じると csSimpleDLLKey.snk という名前のファイルができます.
今回はパスワードは設定しませんでした.[キーファイルをパスワードで保護する] のチェックを意図的に外しました.



図7
キーファイル名を入力
  • csSimpleDLLKey.snk というファイルが作成される




05_プロジェクトをビルドして DLL とタイプライブラリを作成


以上で準備が整いました.プロジェクトをビルドして DLL を作成します.
メニューの [ビルド] から [ソリューションのビルド] をクリックすると DLL とタイプライブラリのファイルが [bin] [Release] フォルダ内に作成されます.それと同時にシステムに DLL とタイプライブラリが登録されます.

[ビルド] で [ソリューションのクリーン] をクリックすると,作成済みの DLL とタイプライブラリのファイルが削除され,システムへの登録も解除されます.レジストリの関係キーも削除されます.



図8
プロジェクトのビルド
  • [ソリューションのビルド]
図9
ビルドして作成したファイル
  • [bin] [Release] 内に作成される
  • DLL とタイプライブラリのファイル

下図はレジストリに登録さりた ProgId キーです.
この他にも HKEY_CLASSES_ROOT\TypeLib 階層下に GUID のキーが作成されます.



図10
ProgId キー

[備考]
[ビルド] [構成] が Release の時 Visual Studio の IDE を管理者権限で起動していないと,DLL は作成できますが,DLL のシステムへの登録は行われません.また,タイプライブラリファイルも作成されません.
このような場合は,後述の RegAsm.exe を使用して DLL のシステムへの登録とタイプライブラリファイルの作成を行う必要があります.
[ビルド] [構成] が Debug で DLL を作成した場合も,RegAsm を使用して DLL のシステムへの登録とタイプライブラリファイルの作成を行います.





06_Delphi の IDE からタイプライブラリを取り込む


Visual Studio のプロジェクトのビルドでタイプライブラリがシステムに登録されました.
これで Visual Studio での作業は終了です.

Delphi の IDE を管理者権限で起動します.[コンポーネント] [コンポーネントのインポート] のダイアログで [タイプライブラリの取り込み] を選択します.下図のダイアログでは csSimpleDLL を選択します.コンポーネントラッパーの作成は必要ありません.ユニットの作成だけで十分です.

リストに csSimpleDLL がない場合は [追加] で csSimpleDLL.tlb を追加します.
タイプライブラリのファイル csSimpleDLL.tlb がないは場合は,コマンドプロンプトを管理者権限で起動して,以下の形式のコマンドで作成できます.ファイル名は全てフルパスで指定します.後述の [実行環境で使用するには RegAsm.exe で DLL を登録する] を参考にしてください.


RegAsm.exe csSimpleDLL.dll /tlb:csSimpleDLL.tlb

ユニットを作成したら csSimpleDLL.tlb は必要ありません.削除して構いません.また,Delphi のタイプライブラリの一覧から csSimpleDLL を登録から削除して構いません.今回のような,テスト的に作成したタイプライブラリのリストがあるとトラブルの原因になるかも知れません.



[備考]
Delphi の IDE を管理者権限で起動しないでタイプライブラリの取り込みを行うと
『EOleSysError がモジュール Project1.exe の 00059EB1 で発生しました。
  OLE レジストリへのアクセス エラーです。』
というエラーかが発生しすます.



図11
タイプライブラリの取り込み


以下は作成されたユニットのコードです.ユニット名は csSimpleDLL_TLB となっています.
Delphi のプロジェクトでは,このユニット,csSimpleDLL_TLB を uses 部に追加して利用します.



リスト4
タイプライブラリの取り込みで作成したユニットのコード
unit csSimpleDLL_TLB;

// ************************************************************************ //
// 警告                                                                       
// -------                                                                    
// このファイルで宣言されている型はタイプ ライブラリから読み取られたデータから 
// 生成されています。このタイプ ライブラリが明示的あるいは(このタイプ ライブラ 
// リを参照しているほかのタイプ ライブラリ経由で)間接的に再インポートされた   
// り、タイプ ライブライブラリの編集中にタイプ ライブラリ エディタの[更新]コマ 
// ンドを実行した場合、このファイルの内容はすべて再生成され、手動で加えた変更 
// はすべて失われます。                                                       
// ************************************************************************ //

// $Rev: 52393 $
// 下に説明されたタイプ ライブラリから 2018/10/04 22:20:29 に生成されたファイル。

// ************************************************************************  //
// タイプ ライブラリ:
//        D:\dotNetDllTest\CSharpDll\csSimpleDLL\bin\Release\csSimpleDLL.tlb (1)
// LIBID: {0F9E203F-FF6C-47BB-878F-DB6428FEFCAF}
// LCID: 0
// ヘルプファイル: 
// ヘルプ文字列: 
// 依存関係リスト: 
//   (1) v2.0 stdole, (C:\Windows\SysWOW64\stdole2.tlb)
//   (2) v2.4 mscorlib, (C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.tlb)
// SYS_KIND: SYS_WIN32
// ************************************************************************ //
{$TYPEDADDRESS OFF} // ポインタの型チェックをオフにしてコンパイルすること
{$WARN SYMBOL_PLATFORM OFF}
{$WRITEABLECONST ON}
{$VARPROPSETTER ON}
{$ALIGN 4}

interface

uses Winapi.Windows, mscorlib_TLB, System.Classes, System.Variants, System.Win.StdVCL, 
  Vcl.Graphics, Vcl.OleServer, Winapi.ActiveX;


// *********************************************************************//
// タイプ ライブラリで宣言される GUID. 以下のプレフィックスを使う:        
//   Type Libraries     : LIBID_xxxx                                      
//   CoClasses          : CLASS_xxxx                                      
//   DISPInterfaces     : DIID_xxxx                                       
//   Non-DISP interfaces: IID_xxxx                                        
// *********************************************************************//
const
  // タイプ ライブラリのメジャー バージョンとマイナー バージョン
  csSimpleDLLMajorVersion = 1;
  csSimpleDLLMinorVersion = 0;

  LIBID_csSimpleDLL: TGUID = '{0F9E203F-FF6C-47BB-878F-DB6428FEFCAF}';

  IID_ICalcFuncs: TGUID = '{3C809CC0-E8C6-408C-8843-F290F38E54B3}';
  CLASS_CalcFuncs: TGUID = '{B835F7A6-B8E3-4336-9010-0BAFE7EE4DED}';
type
// *********************************************************************//
// タイプ ライブラリで宣言される前方参照
// *********************************************************************//
  ICalcFuncs = interface;
  ICalcFuncsDisp = dispinterface;
// *********************************************************************//
// タイプ ライブラリで宣言される CoClass
// (注意: ここで各 CoClass とデフォルトのインターフェイスをマッピングする)
// *********************************************************************//
  CalcFuncs = ICalcFuncs;


// *********************************************************************//
// インターフェイス: ICalcFuncs
// フラグ: (4416) Dual OleAutomation Dispatchable
// GUID: {3C809CC0-E8C6-408C-8843-F290F38E54B3}
// *********************************************************************//
  ICalcFuncs = interface(IDispatch)
    ['{3C809CC0-E8C6-408C-8843-F290F38E54B3}']
    function GetText: WideString; safecall;
    function AddInt(AInt1: Integer; AInt2: Integer): Integer; safecall;
  end;

// *********************************************************************//
// DispIntf:  ICalcFuncsDisp
// フラグ:     (4416) Dual OleAutomation Dispatchable
// GUID:      {3C809CC0-E8C6-408C-8843-F290F38E54B3}
// *********************************************************************//
  ICalcFuncsDisp = dispinterface
    ['{3C809CC0-E8C6-408C-8843-F290F38E54B3}']
    function GetText: WideString; dispid 1610743808;
    function AddInt(AInt1: Integer; AInt2: Integer): Integer; dispid 1610743809;
  end;

// *********************************************************************//
// クラス CalcFuncs は、Create および CreateRemote メソッドを使用して
// CoClass CalcFuncs が公開するデフォルトのインターフェイス ICalcFuncs の
// インスタンスを作成する。このタイプ ライブラリのサーバーによって
// 公開された CoClass オブジェクトに対し、オートメーションを行いたい
// クライアントが用いるために、これらの関数が存在する。
// *********************************************************************//
  CoCalcFuncs = class
    class function Create: ICalcFuncs;
    class function CreateRemote(const MachineName: string): ICalcFuncs;
  end;

implementation

uses System.Win.ComObj;

class function CoCalcFuncs.Create: ICalcFuncs;
begin
  Result := CreateComObject(CLASS_CalcFuncs) as ICalcFuncs;
end;

class function CoCalcFuncs.CreateRemote(const MachineName: string): ICalcFuncs;
begin
  Result := CreateRemoteComObject(MachineName, CLASS_CalcFuncs) as ICalcFuncs;
end;

end.




07_Delphi のプロジェクトでの使用方法


以下は,作成した csSimpleDLL_TLB.pas ファイルを使用するサンプルコードです.
タイプライブラリの取り込みで作成したユニットを使用するということは,元の DLL や OCX 内の関数等を使用することと同じです.
使用方法は,エクセルやワード等,他の COM オブジェクトを使用する時と同じです.



図12
実行結果
  • どのボタンクリックでも結果は同じ

リスト5
C# で作成した DLL 内の関数のテスト用コード
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, csSimpleDLL_TLB;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses
  ComObj;

{$R *.dfm}

//=============================================================================
//  C#用DLL内の関数をCOM参照で使用する例
//  CreateComObjectでCOM オブジェクトを生成する例
//
//  usesにComObjが必要
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  LDllClass : ICalcFuncs;
  LIntA     : Integer;
  LIntB     : Integer;
  LIntC     : Integer;
  LText     : string;
begin
  Memo1.Lines.Clear;

  LDllClass := CreateComObject(CLASS_CalcFuncs) as ICalcFuncs;

  LText := LDllClass.GetText;
  Memo1.Lines.Add(LText);

  LIntA := 100;
  LIntB := 250;
  LIntC := LDllClass.AddInt(LIntA, LIntB);
  Memo1.Lines.Add(IntToStr(LIntC));
end;

//=============================================================================
//  C#用DLL内の関数をCOM参照で使用する例
//  CoXXXクラスのCreateメソッドで生成する例
//
//  usesにComObjは必要ない
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
  LDllClass : ICalcFuncs;
  LIntA     : Integer;
  LIntB     : Integer;
  LIntC     : Integer;
  LText     : string;
begin
  Memo1.Lines.Clear;

  LDllClass := CoCalcFuncs.Create;

  LText := LDllClass.GetText;
  Memo1.Lines.Add(LText);

  LIntA := 100;
  LIntB := 250;
  LIntC := LDllClass.AddInt(LIntA, LIntB);
  Memo1.Lines.Add(IntToStr(LIntC));
end;

//=============================================================================
//  C#用DLL内の関数をCOM参照で使用する例
//  ProgIDを指定してCreateOleObjectでCOM オブジェクトを生成する例
//  タイプライブラリの取り込みで作成したユニットは不要
//
//  usesにComObjが必要
//=============================================================================
procedure TForm1.Button3Click(Sender: TObject);
var
  LDllClass : OleVariant;
  LIntA     : Integer;
  LIntB     : Integer;
  LIntC     : Integer;
  LText     : string;
begin
  Memo1.Lines.Clear;

  LDllClass := CreateOleObject('csSimpleDLL.CalcFuncs');

  LText := LDllClass.GetText;
  Memo1.Lines.Add(LText);

  LIntA := 100;
  LIntB := 250;
  LIntC := LDllClass.AddInt(LIntA, LIntB);
  Memo1.Lines.Add(IntToStr(LIntC));
end;

end.




08_タイプライブラリの取り込みなしで C# の DLL を使用する


タイプライブラリの取り込みをしなくても C# の DLL 内のクラスの COM オブジェクトを生成して操作できます.その場合,C# の DLL のソースコードはそのままで,DLL のプロジェクトの COM 参照関係だけを設定します.
Delphi 側では ProgId を指定して,CreateOleObject 関数で DLL 内のクラスのオブジェクトを生成します.オブジェクトの型は OleVariant 型とします.
ProgId の名前は,名前空間.クラス名 とします.これは,エクセルの COM オブジェクトを以下のように生成するのと同じ方法です.


procedure TForm1.Button1Click(Sender: TObject);
var
  LExcelObj : OleVariant;
begin
  LExcelObj := CreateOleObject('Excel.Application');
  ...
  ...
end;

COM オブジェクトを OleVariant 型で扱う場合,コード補完の入力支援機能のリストに,クラスの関数類の名前は表示されません.
DLL のソースコードに COM インターフェイス関係のコードがないと,タイプライブラリの取り込みでユニットを作成しても意味がありません.



図13
下のコードの実行結果

リスト6
DLL のコードをそのまま使用する場合は,CreateOleObject 関数でオブジェクトを生成する
オブジェクトの型は OleVariant とする
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses
  ComObj;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  LDllClass : OleVariant;
  LIntA     : Integer;
  LIntB     : Integer;
  LIntC     : Integer;
  LText     : string;
begin
  Memo1.Lines.Clear;

  LDllClass := CreateOleObject('csSimpleDLL.CalcFuncs');

  LText := LDllClass.GetText;
  Memo1.Lines.Add(LText);

  LIntA := 100;
  LIntB := 250;
  LIntC := LDllClass.AddInt(LIntA, LIntB);
  Memo1.Lines.Add(IntToStr(LIntC));
end;

end.




09_実行環境で使用するには RegAsm.exe で DLL を登録する


作成した DLL を,開発環境でない環境で使用するには,DLL を実行環境のシステムに登録する必要があります.
Delphi あるいは C, C++ で作成した DLL は Regsvr32.exe (32 ビット DLL の場合) でシステムに登録しますが,.NET Framework 用の開発言語で作成した DLL は .NET Framework に付属の RegAsm.exe を使用します.

今回は登録する DLL を EXE と同じフォルダ内に置いて動作確認しました.開発環境とは別のコンピュータでテストしています.以下は DLL の登録コマンド例です.RegAsm.exe にはシステム的にパスが通っていないので,フルパスで指定しています.

ダウンロードした ZIP ファイルに添付している DLL は,.NET Framework 4.5 を対象として作成しています.実行環境のコンピュータにインストールされている .NET Framework のバージョンが異なると登録に失敗することがあります.


C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe /codebase C:\000\DelphiProject\csSimpleDLL.dll

登録を解除する時は,以下のように /u オプションを付けて RegAsm.exe を実行します.
登録も登録解除も管理者権限で実行する必要があります.


C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe /u C:\000\DelphiProject\csSimpleDLL.dll


図14
DLL の登録
  • 管理者権限での実行が必要

[備考]
C# で DLL を作成する時に DLL に厳密な名前を登録しておくと,RegAsm.exe で DLL をシステムに登録する時に /codebase オプションが指定できます.
/codebase オプションを指定して DLL を登録すると,任意の場所の EXE からその DLL を認識できるようになります.

Delphi や C, C++ で作成した DLL の COM オブジェクトを利用する場合は,その DLL がシステム的にパスの通った場所にないと利用できません.
Delphi や C, C++ で作成した DLL を LoadLibrary で使用する場合は,その DLL がシステム的にパスの通った場所になくても利用できます.





10_Visual Studio Express 2013 における C# の DLL の新規作成


Visual Studio で C# の DLL を新規に作成する手順です.
今回のように COM 参照を設定する場合は Visual Studio を管理者として起動します.Visual Studio を起動したらメニューの [ファイル] で [新しいプロジェクト] をクリックします.下図の [新しいプロジェクト] の設定用ダイアログが表示されます.

[テンプレート] の [Visual C#] [Windows] を選択して [クラスライブラリ] を選択します.
下方の [名前] が DLL の名前で,プロジェクト名になります.[場所] はプロジェクトの保存先のフォルダです.設定したら [OK] ボタンをクリックします.

Delphi ではプロジェク名等を変更したい場合,別の名前で保存すれば済みまずか,Visual Studio ではソリューションファイル (拡張子は sln) の編集が必要等,面倒です.DLL 名 (プロジェクト名) を確実に決めてから設定することをお勧めします.



図15
DLL 新規作成