Вызов динамической функции при ошибке объекта - PullRequest
0 голосов
/ 18 сентября 2010

Я знаю, что название звучит немного странно, но это немного ошеломило меня.Поэтому Intel предлагает этот гаджет для боковой панели TurboBoost с вызовами с использованием JavaScript, и я хочу написать программу с нуля на C #, которая делает то же самое.Звонки происходят от того, что я считаю ActiveX DLL, которую я легко импортировал.Проблема в том, что всякий раз, когда я пытаюсь вызвать функцию, она выдает мне ошибку «ссылка на объект требуется для нестатического поля ...»состав.Я попытался разделить функции и сделал их статичными, но все равно не повезло.Вот код (ITurboBoostClient - это часть интерфейса):

namespace TurboBoostMon_CLI
{
    class Program
    {
        public static object GetCPUFreq()
        {
            object n = ITurboBoostClient.GetCurBaseFrequency(); //<---- error
            //return Convert.ToDouble(n);
            return n;
        }

        public static void Main(string[] args)
        {
            object cpubasefreq = GetCPUFreq();
            Console.WriteLine(cpubasefreq); // neglect the output for now
        }
    }
}

Ответы [ 2 ]

1 голос
/ 18 сентября 2010

Если используются типичные соглашения об именах, ITurboBoostClient имеет значение interface, и у вас нет экземпляра объекта, реализующего интерфейс. Отсюда и ошибка.

Не зная больше о ActiveX DLL, трудно точно сказать, что делать, но это будет примерно так:

{
    ITurboBoostClient myClient = TurboBoostFactory.GetInstance();
    object n = myClient.GetCurBaseFrequencey();
    return n;
}

Обратите внимание, что в первой строке вы вызываете статический метод, который может создать требуемый класс (с интерфейсом). Тогда вы действительно можете использовать этот интерфейс.

Просмотрите еще раз импортированную библиотеку ActiveX и посмотрите, сможете ли вы найти фабричный метод, метод CreateInstance или какой-либо другой экземпляр, который создаст исходный объект.

0 голосов
/ 18 сентября 2010

Если вы получаете эту ошибку, вам нужно объявить что-то как новый объект. Предполагая, что ваш маркер ошибки правильный, вам нужно изменить его, чтобы создать новый экземпляр некоторого объекта, который наследует ITurboBoostClient, а затем использовать его для вызова метода GetCurBaseFrequenct ().

Что-то вроде:

ITurboBoostClient myTurboBoost = new TurboBoostClientObject(); // Making names up here, not familiar with the framework you're working with.
object n = myTurboBoost.GetCurBaseFrequency();

Извините, я не знаю, какой класс вам нужен для создания экземпляра, но краткий обзор в Google наверняка покажет.

...