0

コンテキスト: VS2015 コミュニティ。C#; ClearScript.V8.5.4.5; Google.AdWords.18.25.0

Budgets を実行するためのスクリプト環境を作成しようとしています。C# 側では、JScript 環境をセットアップし、必要なすべての AdWords の型とオブジェクトを公開しています。

    static JScriptEngine JSengine = null;
    static Dictionary<string, object> Settings = new Dictionary<string, object>();

    static void Main(string[] args)
    {
        if (args.Length < 1)
        {
            Console.WriteLine("engine script.js");
            Environment.Exit(1);
        }
        string scriptSpec = args[0];

        try
        {
            JSengine = new JScriptEngine(WindowsScriptEngineFlags.EnableDebugging | WindowsScriptEngineFlags.EnableJITDebugging);
        }
        catch (Exception exc)
        {
            return;
        }

        // .. others as well e.g. File, Environment etc

        JSengine.AddHostType("AdWordsUser", typeof(AdWordsUser));
        JSengine.AddHostType("AdWordsAppConfig", typeof(AdWordsAppConfig));
        JSengine.AddHostType("BudgetOrderService", typeof(BudgetOrderService));
        JSengine.AddHostType("Selector", typeof(Selector));
        JSengine.AddHostType("Predicate", typeof(Predicate));
        JSengine.AddHostType("BudgetOrderPage", typeof(BudgetOrderPage));
        JSengine.AddHostType("BudgetOrder", typeof(BudgetOrder));
        JSengine.AddHostType("PredicateOperator", typeof(PredicateOperator));
        JSengine.AddHostType("AdWordsService", typeof(AdWordsService));

        JSengine.AddHostObject("Settings", Settings);

        object answer = null;
        string script = File.ReadAllText(scriptSpec);
        try
        {
            answer = JSengine.Evaluate(script);
        }
        catch (ScriptEngineException see)
        {
            Console.WriteLine(see.ErrorDetails);
        }
    }

私はこの種のことをすでに数回行っているので、そこに驚きはありません。

私が現在抱えている問題は、JScript 側の 1 つです。この時点でのコードは次のようになります。

var user = new AdWordsUser();
user.OAuthProvider.ClientId = "anonymised.apps.googleusercontent.com";
user.OAuthProvider.ClientSecret = "anonymised";
user.OAuthProvider.AccessToken = "";
user.Config.OAuth2RefreshToken = "anonymised";
user.OAuthProvider.RefreshAccessToken();

var config = new AdWordsAppConfig();
config.ClientCustomerId = "anonymised";
config.DeveloperToken = "anonymised";
config.UserAgent = "anonymised";
config.OAuth2ClientId = user.OAuthProvider.ClientId;
config.OAuth2ClientSecret = user.OAuthProvider.ClientSecret;
config.OAuth2AccessToken = user.OAuthProvider.AccessToken;
config.OAuth2RefreshToken = user.Config.OAuth2RefreshToken;

var bos = user.GetService(AdWordsService.v201603.BudgetOrderService);
var bas = bos.getBillingAccounts();

この時点で、 はbosについて何も知りませんgetBillingAccountsbosそれを知る唯一の方法は、実行することです

var bos = new BudgetOrderService();

ただし、bosと で必要な値の間に接続がなくuser、実行しようとするとgetBillingAccountsエラーが発生します。

これが派生する元の C# コードは次のとおりです。

BudgetOrderService bos = (BudgetOrderService)user.GetService(AdWordsService.v201603.BudgetOrderService);
BillingAccount[] bas = bos.getBillingAccounts();

GetServiceに呼び出しをキャストするだけで、で表示できるようBudgetOrderServiceになります。しかし、JScript ではそれができません。getBillingAccountsbos

では、ここからどこへ?

4

1 に答える 1

1

スクリプト コードでキャストできるはずです。これを試して:

// C#
JSengine.Script.host = new HostFunctions();

次に、スクリプトで次のようにします。

// JavaScript
var bos = user.GetService(AdWordsService.v201603.BudgetOrderService);
bos = host.cast(BudgetOrderService, bos);

または、C# コードでキャストを行うデリゲートを公開できます。

于 2016-05-12T12:58:37.733 に答える