Dot-Net

如何在 CIL DLL 中導出方法以便本地程序可以呼叫它?

  • May 21, 2021

我已經查看了 ECMA 335,但我只找到了一個對關鍵字的引用,這個.export關鍵字看起來很有希望,但文件很少。我在 StackOverflow 上發現了關於在 C# 中執行此操作的類似問題。然而,到目前為止,這些都沒有讓我有任何用處。

底線是:我有一個 CIL DLL,我想從本機 C++ 應用程序呼叫它的一些靜態方法。

在較新版本的 ILAsm 中,您可以簡單地執行以下操作:

.method public static void Foo ()
{
   .export [1]

   // code ...
}

這會在導出表中的索引 1 處導出 Foo。導出序號應該是唯一且連續的。

在舊版本中,您必須執行以下操作:

.data vt = int32 (0) [n]
.vtfixup [n] int32 fromunmanaged at vt

.method public static void Foo ()
{
   .vtentry 1:1
   .export [1]

   // code ...
}

(其中“n”是您想要的出口量。)

指示將方法儲存在.vtentry哪個 vtable:slot 中。(表 ID 是連續的,因此取決於聲明順序。)

新的 ILAsms 為您完成所有這些工作,前提是您不將導出表用於其他任何事情。

請注意,所有這些都是非常不便攜的。

引用自:https://stackoverflow.com/questions/8957970