C#で作成したDLLの呼び出し方


s23  2018-09-30 18:08:19  No: 49532

お世話になっております。s23です。
今回初めてDLLを使うため、過去の掲示板を見て試行錯誤しましたが、どうしても分かりませんでした。
初歩的な質問ですが、下記ののDLLの呼び出しを、Delphiでどのように書けば良いのか教えていただけないでしょうか。
因みに、私の開発環境はwindows10 pro 64bitで、Delphi 10.2を使っています。
よろしくお願いします。

DLLはC#で作成されたもので次のようになっています。

TCalculation.TCalc.TAnalayis(double[] GetValue)
Dll名:TCalculation
クラス:TCalc
関数:TAnalayis(double[] GetValue)

 
これを呼び出すために次のように書いてみました。
type
  DataArray = array[0..31] of double;

procedure TAnalayis(var data:DataArray); stdcall; external 'TCalculation.dll' ;
  ↑この部分でエラーになってしまいます。

var
  TData : DataArray;

procedure TForm1.Button2Click(Sender: TObject);
begin
  TAnalayis(TData);//関数呼び出し
end;

実行すると、次のアプリケーションエラーが出てしまします。
モジュールの読み込み: netutils.dll. デバッグ情報なし. ベースアドレス: $6F460000. プロセス Project1.exe (12068)


通りすがり  2018-09-30 20:56:41  No: 49533

C#でクラスをエクスポートした形のDLLはDelphiを含めネイティブな開発環境からは簡単には呼び出すことはできません。
と思ったら、"delphi .net framework dll"あたりをキーワードにして検索するといくつか参考になりそうな話があるようです。
RegAsmで登録したDLL上のクラスをCreateOleObjectで生成して呼び出すみたいです。


s23  2018-10-01 00:36:35  No: 49534

通りすがりさん、早速の回答ありがとうございました。
教えていただいた情報で色々と調べてみたのですが、私のスキルでは少々難しそうですね。

仕方がないので、DLLの作者に、「C# to C++ Converter」で作り直して貰うよう調整してみます。


通りすがり  2018-10-01 01:19:37  No: 49535

ちなみにC++でクラスをエクスポートするようなDLLはDelphi(に限らずその開発環境以外で作られたもの全般)からは
直接呼び出すことができません。そういう意味ではC#のほうがましかも…?
お願いするなら一般的なWin32 APIのようなDLLに、というのがいいと思います。


Nov  2018-10-01 09:08:56  No: 49536

C#で作成されたDLLは.netアセンブリですけど、COMエクスポートされた
ものなら普通に呼び出し可能です。
C#ソースがあるならCOMエクスポートすれば、CreateOleObjectで利用
できると思います。


参考  2018-10-02 02:28:55  No: 49537

以下の記事を見つけました。
参考にしてください。

http://www.84kure.com/blog/2014/07/17/c-c%E3%81%8B%E3%82%89c%E3%81%AEdll%E3%82%92%E5%91%BC%E3%81%B6%E6%96%B9%E6%B3%95/


参考  2018-10-02 02:31:46  No: 49538

リンク切れかもしれませんが、

Using a .NET Assembly via COM by Jim McKeeth
http://edn.embarcadero.com/article/32754


参考  2018-10-02 02:33:09  No: 49539

Internet Archiveにて上記が見れました。

https://web.archive.org/web/20180327064014/http://edn.embarcadero.com/article/32754


s23  2018-10-02 03:25:28  No: 49540

Novさん、情報ありがとうございました。
この方法が、一番労力をかけないでできると思いますので、DLL作成者に依頼してみます。

CreateOleObjectの使い方は、下記などを参考にしてみます。
http://mrxray.on.coocan.jp/Delphi/plSamples/400_Excel_CreateObject.htm


s23  2018-10-03 01:48:52  No: 49541

参考さん、情報ありがとうございました。
一通り見てみましたが、私は殆どPascal系しか使ったことがなく、Cは苦手というよりも読むことすらできません。

質問ですが、エクスポートしたCOMを使うのは、エクセルの関数を使うのと同じような方法で使うことはできないのでしょうか。


参考  2018-10-03 04:45:39  No: 49542

過去に同じ質問をされてる方がいますね。
https://www.petitmonte.com/bbs/answers?question_id=6789


参考  2018-10-05 20:49:29  No: 49543

C#でVBA向けの.NETライブラリ(COMコンポーネント)を作成するには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/1064combycs/combycs.html


Mr.XRAY  2018-10-07 05:55:39  No: 49544

>Nov 2018/10/01(月) 00:08:56
>C#ソースがあるならCOMエクスポートすれば、CreateOleObjectで利用 
>できると思います。 

やってみました.
使用した Visual Studio がちょっと古いですが...

[ C# で作成した DLL を Delphi で使用 - COM 参照 ]
http://mrxray.on.coocan.jp/Delphi/Others/Usage_dotNETDll.htm


s23  2018-10-08 17:22:31  No: 49545

Mr.XRAYさん、ありがとうございました。
早速、この内容をDLLの作者に伝えて、改修をお願いしております。

質問ですが、私も動作を確認するため、ダウンロードしたファイルを使用して
 ・Delphi の IDE からタイプライブラリを取り込む
を実行してみましたが、「登録済みのタイプライブラリ」の「追加」で「csSimpleDLL.dll」を指定すると、「タイプライブラリ/DLLの読み込みエラーです」が表示されます。

これは、私のPC環境が.NET Framework 4.5 ではなく.NET Framework 4.7になっているからなのでしょうか?

因みに、私の環境では下記の手順を行っていません。
 ・C# で作成した DLL を COM 参照によって Delphi で使用する手順
 ・C# の DLL に COM インターフェイス用のコードを追加
 ・C# の DLL を COM 参照可能にする設定
 ・DLL を任意の場所に配置できるように厳密な名前を設定
 ・プロジェクトをビルドして DLL とタイプライブラリを作成

以上、よろしくお願いします。


Mr.XRAY  2018-10-08 22:16:03  No: 49546

>「追加」で「csSimpleDLL.dll」を指定すると、「タイプライブラリ/DLLの読み込みエラーです

タイプライブラリのファイルは csSimpleDLL.tlb です.
ただし,DLL に COM インターフェイス用のコードがない場合,
タイプライブラリの取り込みをしても意味ありません.

DLL を EXE と同じフォルダ内に置いて,その DLL をシステムに登録します.
DLL をシステムに登録するには .NETFramework に付属の RegAsm.exe を使用します.
DLL に厳密な名前の設定がない場合は,/codebase オプションは指定しないでください.
正常に動作しないことがあります. 

[ 実行環境で使用するには RegAsm.exe で DLL を登録する ]
http://mrxray.on.coocan.jp/Delphi/Others/Usage_dotNETDll.htm#09

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

↑ は [RegAsm.exe が場所] [DLL がある場所] となっています.
共にフルパスで指定します.

上のコマンドは .NET Framework 4.0 / 4.5 の場合です.
.NET Framework 4.7 の場合は RegAsm.exe の場所が違かも知れません (未確認)


Mr.XRAY  2018-10-08 22:26:19  No: 49547

> ・C# の DLL に COM インターフェイス用のコードを追加 
> ・C# の DLL を COM 参照可能にする設定 
> ・DLL を任意の場所に配置できるように厳密な名前を設定 

ダウンロードした ZIP 書庫内の DLL は上記の設定をして作成しています.


s23  2018-10-08 22:53:04  No: 49548

Mr.XRAYさん、ありがとうございます。 

私の環境は.NET Framework 4.7でしたが、
[ 実行環境で使用するには RegAsm.exe で DLL を登録する ] で、
「型は正常に登録されました」となりました。

その次に、「Delphi の IDE からタイプライブラリを取り込む」で、
「登録済みのタイプライブラリ」の「追加」で「csSimpleDLL.tlb」を指定すると、
「OLEレジストリへのアクセスエラーです」の表示が出てしまいす。 

まだ、何か間違っているのでしょうか?


s23  2018-10-08 22:58:59  No: 49549

Delphiを管理者で実行で起動したら、東特を完了することができました。

お騒がせして申し訳ありませんでした。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加