【问题标题】:How to consume COM object in ASP.NET class file如何在 ASP.NET 类文件中使用 COM 对象
【发布时间】:2011-07-26 10:50:43
【问题描述】:

我有一个 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 应用程序本身内的层的任何帮助将不胜感激。谢谢!!

【问题讨论】:

    标签: asp.net unmanaged createobject com-object


    【解决方案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)。

    【讨论】:

      【解决方案2】:

      你试过使用interoperating

      我过去做过以下事情(从记忆中工作,所以你可能需要稍微摆弄一下):

      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) 有帮助!

      【讨论】:

        猜你喜欢
        • 2016-10-13
        • 2011-10-05
        • 1970-01-01
        • 2011-10-10
        • 1970-01-01
        • 2017-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多