294 / 234 / 58
Регистрация: 03.02.2011
Сообщений: 1,979
Записей в блоге: 1
1
.NET 3.x

Ошибка при вызове метода (позднее связывание)

16.03.2013, 12:28. Показов 2013. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста разобраться с ошибкой вызова:
Миниатюры
Ошибка при вызове метода (позднее связывание)  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.03.2013, 12:28
Ответы с готовыми решениями:

Ошибка при повторном вызове метода Clipboard.SetDataObject
Необходимо программно отправить текст в текстовое поле стороннего приложения. Задавал вопрос в...

Позднее связывание с неуправляемым кодом
Можно ли осуществить позднее связывание с неуправляемым кодом ? Собственно и весь вопрос.

Открытие файла excel позднее связывание
Добрый день всем. Такой вопрос. Делаю по этому тьюториалу -...

При вызове метода из другого файла ошибка "The type initializer for 'Openxls' threw an exception"
Хелп плиз! Прога работала и вдруг перестала при вызове метода из другого файла пишет The type...

15
Эксперт .NET
17207 / 12661 / 3321
Регистрация: 17.09.2011
Сообщений: 20,937
16.03.2013, 12:29 2
Пожалуйста, вот шаги для решения проблемы:
0
294 / 234 / 58
Регистрация: 03.02.2011
Сообщений: 1,979
Записей в блоге: 1
16.03.2013, 12:33  [ТС] 3
kolorotur, ???
Миниатюры
Ошибка при вызове метода (позднее связывание)  
0
Эксперт .NET
17207 / 12661 / 3321
Регистрация: 17.09.2011
Сообщений: 20,937
16.03.2013, 12:46 4
Цитата Сообщение от skilllab Посмотреть сообщение
kolorotur, ???
Ну я ответил до того, как вы картинку подгрузили

Вы достаете информацию о свойстве, а вызвать его пытаетесь как метод.
0
294 / 234 / 58
Регистрация: 03.02.2011
Сообщений: 1,979
Записей в блоге: 1
16.03.2013, 13:04  [ТС] 5
Не понял.
Есть запущенный процесс
C#
1
2
object myProc
Type progType = myProc.GetType();
Есть библиотека
C#
1
Solid = Assembly.LoadFrom(pathToSWASSY);
Я хочу вызвать члена библиотеки для запущенного процесса. Что делаю не так?

Добавлено через 8 минут
Цитата Сообщение от kolorotur Посмотреть сообщение
Ну я ответил до того, как вы картинку подгрузили
смешно.
0
Эксперт .NET
17207 / 12661 / 3321
Регистрация: 17.09.2011
Сообщений: 20,937
16.03.2013, 13:07 6
Цитата Сообщение от skilllab Посмотреть сообщение
Я хочу вызвать члена библиотеки для запущенного процесса. Что делаю не так?
То есть хотите сделать так, чтобы этот член вызвался в стороннем процессе?
Или просто хотите подгрузить ту же либу, которую использует сторонний процесс, и вызвать в ней какой-то метод?

Цитата Сообщение от skilllab Посмотреть сообщение
смешно.
Отож.
0
294 / 234 / 58
Регистрация: 03.02.2011
Сообщений: 1,979
Записей в блоге: 1
16.03.2013, 13:09  [ТС] 7
Цитата Сообщение от kolorotur Посмотреть сообщение
Или просто хотите подгрузить ту же либу, которую использует сторонний процесс, и вызвать в ней какой-то метод?
Именно!
Цитата Сообщение от skilllab Посмотреть сообщение
Ошибка при вызове метода (позднее связывание)
0
Эксперт .NET
17207 / 12661 / 3321
Регистрация: 17.09.2011
Сообщений: 20,937
16.03.2013, 13:33 8
Тогда, наверное, стоит использовать GetMethod, а не GetProperty.
Property — это все-таки свойство, можно получить его значение или присвоить ему другое значение.
В этом случае нужно использовать методы GetValue/SetValue, но они требуют ссылку на экземпляр (если поле не статическое).
0
294 / 234 / 58
Регистрация: 03.02.2011
Сообщений: 1,979
Записей в блоге: 1
16.03.2013, 13:53  [ТС] 9
Цитата Сообщение от kolorotur Посмотреть сообщение
нужно использовать методы GetValue/SetValue
чтобы их использовать, нужно получить Property, чего у меня и не получается.

У члена ActiveDoc в Solid есть только метод Get
Миниатюры
Ошибка при вызове метода (позднее связывание)  
0
Заблокирован
16.03.2013, 13:55 10
Цитата Сообщение от skilllab Посмотреть сообщение
Не понял.
Есть запущенный процесс
C#
1
2
object myProc
Type progType = myProc.GetType();
Есть библиотека
C#
1
Solid = Assembly.LoadFrom(pathToSWASSY);
Я хочу вызвать члена библиотеки для запущенного процесса. Что делаю не так?

Добавлено через 8 минут

смешно.
Кроме автора наверно никто не знает о чем тема. Сначала пишет про позднее связывание, потом про вызов объекта из библиотеки. для конкретного процесса, - напиши в конструкторе класса той библиотеки ссылку на процесс и вот ты уже вызвал объект для конкретного процесса )))
0
Эксперт .NET
17207 / 12661 / 3321
Регистрация: 17.09.2011
Сообщений: 20,937
16.03.2013, 13:57 11
Цитата Сообщение от skilllab Посмотреть сообщение
У члена ActiveDoc в Solid есть только метод Get
Так все-таки свойство.

Цитата Сообщение от skilllab Посмотреть сообщение
чтобы их использовать, нужно получить Property, чего у меня и не получается.
А чтобы получить значение этого свойства, вам нужно создать экземпляр этого класса.
Без экземпляра не существует и значения свойства.
1
294 / 234 / 58
Регистрация: 03.02.2011
Сообщений: 1,979
Записей в блоге: 1
16.03.2013, 14:05  [ТС] 12
Urety, есть программа-объект-процесс. Хочу отвязать статичное использование DLL (меняются версии этих DLL для программы). Для этого хочу использовать позднее связывание.

Изначально код выглядит так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using TargetDLL.Interop.App;
using TargetDLL.Interop.Doc;
public partial class Form1 : Form
    {
        App MyApp;
        Doc MyDoc;
        public Form1()
        {
            InitializeComponent();
            try
            {
                MyApp = (App)Marshal.GetActiveObject("App.Application"); 
            }
            if (MyApp.IActiveDoc == null)
            {
                MessageBox.Show("Open part");
                System.Environment.Exit(-1);
            }
            MyDoc = MyApp.IActiveDoc2;
Добавлено через 1 минуту
Цитата Сообщение от Urety Посмотреть сообщение
напиши в конструкторе класса той библиотеки
Позвоню разработчикам)))

Добавлено через 1 минуту
Цитата Сообщение от kolorotur Посмотреть сообщение
вам нужно создать экземпляр этого класса.
Можете показать как это делается? Спасибо.
Цитата Сообщение от Urety Посмотреть сообщение
про позднее связывание, потом про вызов объекта
а для чего ещё нужно позднее связывание?!?
0
Заблокирован
16.03.2013, 14:09 13
Похоже понял, по скриншоту.
Автор пытается вызвать свойство объекта без создания объекта.
0
294 / 234 / 58
Регистрация: 03.02.2011
Сообщений: 1,979
Записей в блоге: 1
16.03.2013, 14:11  [ТС] 14
kolorotur, кажется начинаю понимать технологию. Нужны ещё классы и интерфейсы от Dll?

Добавлено через 1 минуту
Цитата Сообщение от Urety Посмотреть сообщение
Так и не понял,
Цитата Сообщение от Urety Посмотреть сообщение
Похоже понял,
0
Заблокирован
16.03.2013, 14:40 15
Для смены версий подключаемых библиотек, лучше использовать конфигурационный файл приложения, политики издателя, если gac (разделимая библиотека), придерживаться соглашения о номерах версий (посл два числа для совмест. библ, первые два для несовмест.).
В моем понимании позднее связывание, это проверка и вызов методов на этапе выполнения, а не получение объекта из библиотеки, в процессе работы программы. Может я полностью не вник в суть темы, ну и ладно.

Если надо подгрузить какую либо библиотеку вызвать метод объекта в ней и выгрузить то можно так, но думаю вам врядли поможет:
В библиотеке:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ClassLibrary1
{
    public class Class1:MarshalByRefObject
    {
        public string InvokedMethod() { return "Invoke"; }
    }
}
В основном коде:
C#
1
2
3
4
5
6
7
8
   //Если надо подгрузить библиотеку вызвать метод ее класса и отгрузить назад
            AppDomain classDomain = AppDomain.CreateDomain("Lib");
            var obj = classDomain.CreateInstanceAndUnwrap("ClassLibrary1", "ClassLibrary1.Class1");
            ClassLibrary1.Class1 res = (ClassLibrary1.Class1)obj;
 
            String result = res.InvokedMethod(); //result=invoke;
 
            AppDomain.Unload(classDomain); //удаляем домен с библиотекой
1
294 / 234 / 58
Регистрация: 03.02.2011
Сообщений: 1,979
Записей в блоге: 1
16.03.2013, 15:47  [ТС] 16
Цитата Сообщение от Urety Посмотреть сообщение
если gac
dll не помещаются в GAC у программы-цели. А так понял. Буду разбираться.

Добавлено через 1 час 2 минуты
Цитата Сообщение от kolorotur Посмотреть сообщение
вам нужно создать экземпляр этого класса.
Разобрался!!)))
C#
1
2
3
            Type progType = Type.GetTypeFromProgID("App.Application");
            object myInstance = Activator.CreateInstance(progType);
            var myActiveDoc = progType.InvokeMember("ActiveDoc", BindingFlags.GetProperty, null, myInstance, null);
И, по-ходу, dll (в которой описаны все методы, классы..) тут совсем ни при чем.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.03.2013, 15:47
Помогаю со студенческими работами здесь

Позднее связывание. Получить конкретное окно приложения
Здравствуйте все:) У меня такая проблема: пишу на c# библиотеку в которой содержится форма. На...

Позднее связывание; Точность знакового вещественного числа
Две проблемы: Используя позднее связывание, как получить из конструктора значение числового...

Можно ли в .Net использовать позднее связывание к generic-классам
Всем привет. Подскажите плиз, можно ли в .Net использовать позднее связывание к generic-классам?...

Большое потребление памяти при вызове метода
Наблюдаю очень странное поведение Visual Studio 2008. В моём проекте на C# есть один метод, который...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru