24

.EXE を作成せずに新しいプロセスで静的な .DLL メソッドを実行する方法があるかどうか知りたいです。

私の知る限り、これはネイティブの Win32/64 DLL では不可能です。.NET DLL アセンブリはどうですか?

更新:私は主にこれをプログラムで行うことに興味があることを忘れていました(具体的にはC#コードから)。

ありがとう!

結論: 誰も「敢えて」それを綴ろうとはしませんでしたが、答えはすべて「いいえ」に傾いているようです。従来の方法 (EXE、PowerShell など) のいずれかを使用してプロセスを開始し、そのプロセスに DLL をロードしてコードを実行させる必要があります。私は、マネージド DLL がより多くの機能を備えていることを誤って望んでいたと思います。

声をかけてくれた皆さん、ありがとうございました!

4

5 に答える 5

18

PowerShell プロンプトを開始するだけです。

  [Reflection.Assembly]::LoadFile("Name of your dll")
  [Your.NameSpace.And.TypeName]::YourMethod()

私はあなたがC#からこれを望んでいることを知っています

アセンブリ修飾名を使用してタイプを作成します。

 var t = Type.GetType("NameSpace.Type,Name Of Dll");
 var m = t.GetMethod("NameOfMethod");
 m.Invoke(null, new object[] { params });

これで始められるはずです。

「新しいプロセスで」とはどういう意味か正確にはわかりませんが、これをコマンドラインのいくつかのオプションで開始できる.exe/.ps1にラップすることは難しくありません。

したがって、呼び出す DLL ごとに新しい .exe を作成する必要はありません。

ただし、新しいプロセスを開始する場合は、新しいプロセスを開始する必要があります。これは通常、新しい .EXE を開始することによって行われます。

于 2011-03-02T16:01:08.537 に答える
13

オプション 1: .NET InstallUtil (通常の .NET インストールの一部)

への参照を追加してからSystem.Configuration.Install、次のようなものをアセンブリにドロップします。

[System.ComponentModel.RunInstaller(true)]
public class Sample : System.Configuration.Install.Installer
{
    public override void Uninstall(System.Collections.IDictionary savedState)
    {
        base.Uninstall(savedState);

        this.Context.LogMessage("This can be in a .dll.");
        // Do your thing...
    }
}

次に、.NET InstallUtil を悪用します。

%windir%\Microsoft.NET\Framework\v2.0.50727\installutil /logtoconsole=false /logfile= /u [your assembly .dll here]

特にすべてのコマンド ライン パラメーターがログ記録を無効にしない限り、少し面倒かもしれません。

オプション 2: ネイティブ rundll32 を使用して逆 P/静的クラス メソッドを呼び出す

2016 編集: Nuget パッケージになりました: UnmanagedExports ( src )!

不明な MSIL ディレクティブ(msdn フォーラム、2007 年) は、IL アセンブリ言語プログラマーズ リファレンス (2000 年 10 月 3 日、pg.74) のベータ 1 リリースにリンクしています。

fromunmanaged が指定されている場合、ランタイムは、アンマネージド メソッド呼び出しをマネージド呼び出しに変換し、メソッドを呼び出し、結果をアンマネージド環境に返すサンクを自動的に生成します。

詳細については、Expert .NET 2.0 IL アセンブラーおよびInside Microsoft を参照してください。NET IL アセンブラー. (最適な検索キーワード: ilasm vtentry)。

関連読書:

アンマネージド エクスポート: アセンブリをコンパイルできません(stackoverflow、2010)

管理されていないエクスポート / RGiesecke.DllExport.dll (stackoverflow、2010)

stdcall を使用して Delphi アプリにインポートできる C# DLL を作成する(stackoverflow、2009 年)

アンマネージドエクスポート用の C# プロジェクト テンプレート( Robert Giesecke、2010) - msbuild、vs2010 統合

IKVM.Reflection 更新: 静的マネージ メソッドをアンマネージ DLL エクスポートとしてエクスポート(mono、2011)

C++/CLI を使用しない DLL エクスポートの簡単な方法(codeproject、2009 年) - 64 ビット サポートなし?

.NET 関数のアンマネージド プログラムへのエクスポートを自動化する方法(codeproject、2006) - 64 ビットをサポート

"Reverse P/Invoke" シナリオをサポートするために .Net 4.0 に追加されたものはありますか? (msdn フォーラム、2010 年) - コード リスト

アンマネージド コードはマネージド メソッドをラップできる(codeproject、2004)

潜在的な欠点:

リバース ピンボーク (アンマネージド コードからマネージド コードへのコールバック)に関する問題 (msdn ブログ、2006 年)

逆 P/Invoke と例外(msdn ブログ、2008 年)

于 2011-03-09T21:40:57.457 に答える
1

Windows に同梱されている rundll32.exe プログラムを調べます。dll に関する特定の情報がわかっている場合は、このプログラムを使用してその dll 内のコードを実行できる場合があります。

于 2011-03-02T16:01:28.973 に答える
0

を使用して、プロセスを起動し、dll 関数を実行できますrundll32.exe dll_name,method_name。C# では、次のようなことができます。

myProcess = new Process {StartInfo = {FileName = "rundll32.exe", Arguments = "my_dll_name.dll,my_function_name"}};
myProcess.Start();

DLL が PATH にあることを確認してください。何らかの単体テストを実行することを検討している場合は、TearDown / CleanUp メソッドでプロセスを強制終了してくださいmyProcess.Kill()。そうしないと、DLL がロードされたままになり、開発プロセスの一部として上書きできなくなります。DLL を保持しているすべてのプロセスを強制終了し、ビルド前のイベントに追加するコマンド ライン アプリケーションについては、この記事も参照してください。freelib.exe my_dll_name.dll

于 2014-08-17T23:16:39.197 に答える
0

.NET アセンブリはPowerShell に読み込むことができます。(まあ、PowerShell は EXE ですが、特定のアセンブリからのコードの実行に特化したものではありません)

于 2011-03-02T16:01:53.947 に答える