Как потреблять COM-объект в файле класса ASP.NET
-
14-11-2019 - |
Вопрос
У меня есть объект 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;
}
.
К сожалению, объект сервера ограничен некоторыми библиотеками 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-объекта к слою, которое не в самом веб-приложении, в самом себе, очень ценится. Спасибо !!
Решение
Declare DLL functions within a class. Then define a static method for each DLL function you want to call. The following code sample creates a wrapper named Win32MessageBox that calls the MessageBox function in User32.dll each time a .NET app calls the object Show method. It requeres the System.Runtime.InteropServices namespace.
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);
}
}
To call it, just type:
Win32MessageBox.Show("StackOverflow!", "my stack box");
The method where you call the above line doesn't need to be aware that it's a actually calling a function in an unmanaged DLL.
Resources: the MCTS Self-Paced Training Kit (Exam 70-536) by Tony Northrup.
Другие советы
Hove you tried usinsing interoperating
I've done the following in the past (working from memory so you might need to fiddle with this a bit):
- Right Click "References" in your project
- Select "Add Reference"
- Selelct the "Com" Tab
- Find and add your Com Instnace
In your class file
using yourComName;
public static string GetUserName()
{
yourComName.yourComClass jdObj = new yourComClass();
string username = jdObj.GetUserName(someParameters);
return username;
}
Hope this a) works and b) helps!