1

学習のために、C#からアセンブリ関数を呼び出そうとしています。私は非常に無菌的なプロジェクトで、できる限り簡単にすべてを行っています。これが私のアセンブリです(主にcodeprojectからカットアンドペーストします):

.386
.model flat, stdcall
option casemap :none

include \masm32\include\masm32rt.inc

.code
LibMain proc instance:dword,reason:dword,unused:dword 
     mov     eax,1
     ret
LibMain     endp
PrintMess proc
     print "Test"
     exit
PrintMess endp
End LibMain

注:アセンブリは問題なくビルドされます。エラーはなく、唯一の警告は、masm32rt.incに.modelアセンブラーが無視している別の行があることです。この警告は問題ありません。これらの手順を使用して環境をセットアップしました。

私がよく知っている言語であるC#の場合、2つの主要なアプローチを試しました。リフレクションと参照としてのDLLの追加です。どちらも、アセンブリマニフェストが必要であるというエラーを表示します。ここで私は途方に暮れています。

私のC#は単純です:

Assembly mylib = Assembly.LoadFile(@"C:\mypath\MyLib.dll");

そして、私The module was expected to contain an assembly manifest. (Exception from HRESULT: 0x80131018)はその行にエラーとして表示されます。アセンブリマニフェストについては何も知りません。作成して埋め込む方法についての方向性をいただければ幸いです。

4

1 に答える 1

3

「組み立て」という言葉は2つの意味を持ちます。MASMを使用する場合、アセンブリは「マシンコード」を意味します。.NETを使用する場合、アセンブリは「マネージコードのコンテナ」を意味します。

Assembly.LoadXxx()は、.NETツールで作成された.NETアセンブリのみをロードできます。純粋なマシンコードを含むDLLをロードすることはできません。DLL内の関数を呼び出すには、[DllImport]属性でpinvokeを使用する必要があります。

また、DLLが実際に関数をエクスポートすることを確認することをお勧めします。Visual Studioコマンドプロンプトで、DLLに対してdumpbin.exe / exportsを実行して、エクスポートされた名前を確認します。「PrintMess」が表示されない可能性があります。どの関数をエクスポートする必要があるかを指示するために、.defファイルをリンカーに渡す必要があります。

于 2012-08-13T19:33:19.747 に答える