1

我有一个 COM 对象,我试图将其包装在 C# 类中,以便使其更容易被其他希望使用它的应用程序使用。

我有以下代码创建 COM 对象的实例,然后使用反射调用方法来检索用户数据。此代码位于 aspx 页面中时可以正常工作。

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

但是,当我将代码移动到类文件 (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 函数定义一个静态方法。以下代码示例创建一个名为 Win32MessageBox 的包装器,每次 .NET 应用调用对象 Show 方法时,它都会调用 User32.dll 中的 MessageBox 函数。它需要 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. 查找并添加您的 Com 实例

在你的类文件中

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 回答