3

RGiesecke DLLExport ライブラリを使用して、VC6 上に構築されたレガシー アプリケーションから動的にロードできる C# DLL を生成しています。メソッドをエクスポートし、VC6 コードから呼び出されました。問題はありません。ただし、.net クラスのいずれかで変数を宣言しようとすると、クラッシュしました。

    //I tried CallingConvention = CallingConvention.StdCall too
    [DllExport(CallingConvention = CallingConvention.Winapi)]
    static void GetDwgReferences(string fileName)
    {
        //OK: inialize System classes of .net
        DateTime dateTime = DateTime.Now;

        //crashing here: declare a variable of my static class (.net assemebly)
        //SafeString safeString;

        //crashing here: declare a variable of my class (.net assemebly)
        //Email email;

        //crashing here: initialize an object of my class (.net assemebly)
        //DwgXrefs dwgXrefs = new DwgXrefs();

        //crashing here by declcare a variable of third-party library (.net assemebly)
        //ExSystemServices _serv;
     }

どうしたの?助けてください。

4

2 に答える 2

2

メタトレーダーで管理されていないエクスポートを使用して、関連する管理された dll をロードしようとすると、ここで同様の問題が発生しました。

掘り下げた後、私は問題を見つけたと思います。アプリ ドメインは、おそらく期待する場所ではありません。CLR はアセンブリを解決しようとしていますが、説明のないエラーで失敗しています。私の場合、アプリ ドメインは実際にはホスト アプリケーションのディレクトリで実行されていたので、これは常に当てはまると思います。

私がお勧めするのは、依存関係のないベア dll をビルドし、次のような場所に配置することです。

static void Initialize()
{
        SimpleLog.WriteLog("App -" + AppDomain.CurrentDomain.BaseDirectory);
}

[DllExport("Test", CallingConvention = CallingConvention.StdCall)]
public static void Test()
{
    Initialize();
}

よくわかりませんが、ここで静的コンストラクターを使用できない可能性があると思いますか?

ログに、そのドメインの実行ディレクトリが表示されます。ここにアセンブリを配置すると、(うまくいけば) 動作するはずです。ここで私の問題を修正しました。次の質問は、これらのアセンブリをここに配置したくない場合があるため、実行時にドメインを変更できるかどうかです。

単純なロガーのソース コードが必要な場合は、google を使用してください。明らかに、dll 依存関係を持つサード パーティのログ フレームワークを使用しないでください。

私はこれを適応させたものだと思います: http://www.codeproject.com/Articles/80175/Really-Simple-Log-Writer

于 2013-05-09T22:00:12.020 に答える