1

C#クラスでラップしようとしているCOMオブジェクトがあり、それを使用したい他のアプリケーションでより簡単に利用できるようにしています。

COMオブジェクトのインスタンスを作成する次のコードがあります。次に、リフレクションを使用して、ユーザーデータを取得するメソッドを呼び出します。このコードは、aspxページにある場合は正常に機能します。

object jdObj = Server.CreateObject("jd_api.UserCookie");
string username = jdObj.GetType().InvokeMember("GetUserName", System.Reflection.BindingFlags.InvokeMethod, null, jdObj , null).ToString();

ただし、実際のWebサイトからコードを抽象化するためにコードをクラスファイル(JD_API.cs)に移動すると、コードを機能させることができなくなります。たとえば、次のように宣言された静的メソッドがあります。

public static string GetUserName() {

    object jdObj = Server.CreateObject("jd_api.UserCookie");
    string username = jdObj.GetType().InvokeMember("GetUserName",
System.Reflection.BindingFlags.InvokeMethod, null, jdObj , null).ToString();

    return username;
}

残念ながら、Serverオブジェクトは、デフォルトでWebアプリケーションに含まれている一部のASP.NETライブラリに制限されているため、上記のコードは使用できませんでした。したがって、この時点で、次のようなCOMオブジェクトのインスタンスを作成することにしました。

public static string GetUserName() {

    Type type = Type.GetTypeFromProgID("jd_api.UserCookie");
    object jdObj = Activator.CreateInstance(type);

    string username = jdObj.GetType().InvokeMember("GetUserName", System.Reflection.BindingFlags.InvokeMethod, null, jdObj , null).ToString();

    return username;
}

ただし、実行時に、「保護されたメモリの読み取りまたは書き込みを試みました。これは、他のメモリが破損していることを示していることがよくあります。 」というエラーが表示されます。

ここからどこへ行けばいいのかわからない。このCOMオブジェクトのインスタンスをWebアプリケーション自体の内部にないレイヤーに抽象化する方法についてのヘルプをいただければ幸いです。ありがとう!!

4

2 に答える 2

1

クラス内でDLL関数を宣言します。次に、呼び出すDLL関数ごとに静的メソッドを定義します。次のコードサンプルは、.NETアプリがオブジェクトのShowメソッドを呼び出すたびにUser32.dllのMessageBox関数を呼び出すWin32MessageBoxという名前のラッパーを作成します。System.Runtime.InteropServices名前空間が必要です。

using System;
using System.Runtime.InteropServices;

class Win32MessageBox
{
    [DllImport("user32.dll")]
    private static extern int MessageBox(IntPtr hWnd, String text,
        String caption, uint type);

    public static void Show(string message, string caption)
    {
        MessageBox(new IntPtr(0), message, caption, 0);
    }
}

これを呼び出すには、次のように入力します。

Win32MessageBox.Show("StackOverflow!", "my stack box");

上記の行を呼び出すメソッドは、それが実際にアンマネージDLLの関数を呼び出していることを認識する必要はありません。

リソース:Tony NorthrupによるMCTSセルフペーストレーニングキット(試験70-536)。

于 2011-03-30T23:14:21.640 に答える
0

相互運用を使用してみましたか

私は過去に次のことを行いました(メモリから作業しているので、これを少しいじる必要があるかもしれません):

  1. プロジェクトの「参照」を右クリックします
  2. 「参照の追加」を選択します
  3. [Com]タブを選択します
  4. ComInstnaceを見つけて追加します

クラスファイル内

using yourComName;

public static string GetUserName() 
{
        yourComName.yourComClass jdObj = new  yourComClass();
        string username = jdObj.GetUserName(someParameters);
        return username;
}

これがa)機能し、b)役立つことを願っています!

于 2011-03-30T23:26:12.237 に答える