在c#中運行js腳本(將js文件生成為.dll文件)


原文鏈接:http://www.cnblogs.com/xhan/archive/2010/10/22/1857992.html

 

前言:

本來在搞一個Google翻譯的接口--向Google翻譯發送請求--返回翻譯數據...

 

結果發現發送請求中的一個參數(tk)是需要驗證的,驗證不通過,報403錯誤...

 

網上搜到一個可以自己生成tk值的方法,不過是js寫的...省事的想將js代碼直接拿來用...

 

就看到了博客中的一個例子...

0--

function b(a, b) {
    for (var d = 0; d < b.length - 2; d += 3) {
        var c = b.charAt(d + 2),
            c = "a" <= c ? c.charCodeAt(0) - 87 : Number(c),
            c = "+" == b.charAt(d + 1) ? a >>> c : a << c;
        a = "+" == b.charAt(d) ? a + c & 4294967295 : a ^ c
    }
    return a
}

function tk(a,TKK) {
    for (var e = TKK.split("."), h = Number(e[0]) || 0, g = [], d = 0, f = 0; f < a.length; f++) {
        var c = a.charCodeAt(f);
        128 > c ? g[d++] = c : (2048 > c ? g[d++] = c >> 6 | 192 : (55296 == (c & 64512) && f + 1 < a.length && 56320 == (a.charCodeAt(f + 1) & 64512) ? (c = 65536 + ((c & 1023) << 10) + (a.charCodeAt(++f) & 1023), g[d++] = c >> 18 | 240, g[d++] = c >> 12 & 63 | 128) : g[d++] = c >> 12 | 224, g[d++] = c >> 6 & 63 | 128), g[d++] = c & 63 | 128)
    }
    a = h;
    for (d = 0; d < g.length; d++) a += g[d], a = b(a, "+-a^+6");
    a = b(a, "+-3^+b+-f");
    a ^= Number(e[1]) || 0;
    0 > a && (a = (a & 2147483647) + 2147483648);
    a %= 1E6;
    return a.toString() + "." + (a ^ h)
}

打開vs命令行 運行 "jsc /t:library C:\common.js"

生成報錯···JS1234:在庫的內部只允許類型和包定義

更正此錯誤

  • 確保該代碼只包含類、接口和包。

1--在最外面一層添加class..

class jsCommon{

    function b(a, b) {
        for (var d = 0; d < b.length - 2; d += 3) {
            var c = b.charAt(d + 2),
                c = "a" <= c ? c.charCodeAt(0) - 87 : Number(c),
                c = "+" == b.charAt(d + 1) ? a >>> c : a << c;
            a = "+" == b.charAt(d) ? a + c & 4294967295 : a ^ c
        }
        return a
    }

    function tk(a,TKK) {
        for (var e = TKK.split("."), h = Number(e[0]) || 0, g = [], d = 0, f = 0; f < a.length; f++) {
            var c = a.charCodeAt(f);
            128 > c ? g[d++] = c : (2048 > c ? g[d++] = c >> 6 | 192 : (55296 == (c & 64512) && f + 1 < a.length && 56320 == (a.charCodeAt(f + 1) & 64512) ? (c = 65536 + ((c & 1023) << 10) + (a.charCodeAt(++f) & 1023), g[d++] = c >> 18 | 240, g[d++] = c >> 12 & 63 | 128) : g[d++] = c >> 12 | 224, g[d++] = c >> 6 & 63 | 128), g[d++] = c & 63 | 128)
        }
        a = h;
        for (d = 0; d < g.length; d++) a += g[d], a = b(a, "+-a^+6");
        a = b(a, "+-3^+b+-f");
        a ^= Number(e[1]) || 0;
        0 > a && (a = (a & 2147483647) + 2147483648);
        a %= 1E6;
        return a.toString() + "." + (a ^ h)
    }

}

打開vs命令行 運行 "jsc /t:library C:\common.js"

成功生成...???

3--尷尬-生成到哪里了···

最后研究下jsc的一些文檔吧···找到一份說明:http://www.planabc.net/2011/06/04/use_jscript_to_create_windows_apps_and_libraries/

 

    jsc [選項] <源文件> [[選項] <源文件>…]

    JScript 編譯器選項

    – 輸出文件 –
    /out:<file> 指定二進制輸出文件的名稱
    /t[arget]:exe 創建控制台應用程序(默認)
    /t[arget]:winexe 創建 Windows 應用程序
    /t[arget]:library 創建庫程序集
    /platform:<platform> 限制此代碼可以在其上運行的平台;必須是 x86、Itanium、x64 或 anycpu。默認為 anycpu

    – 輸入文件 –
    /autoref[+|-] 基於導入的命名空間和完全限定名稱自動引用程序集(默認情
    況下為 on)
    /lib:<path> 指定要在其中搜索引用的附加目錄
    /r[eference]:<file list> 從指定的程序集文件引用元數據 <file list>: <assembly name>[;<assembly name>…]

    – 資源 –
    /win32res:<file> 指定 Win32 資源文件(.res)
    /res[ource]:<info> 嵌入指定的資源 <info>: <filename>[,<name>[,public|private]]
    /linkres[ource]:<info> 將指定的資源鏈接到此程序集 <info>: <filename>[,<name>[,public|private]]

    – 代碼生成 –
    /debug[+|-] 發出調試信息
    /fast[+|-] 禁用語言功能以使代碼更好地生成
    /warnaserror[+|-] 將警告視為錯誤
    /w[arn]:<level> 設置警告等級(0-4)

    – 雜項 –
    @<filename> 有關更多選項,請閱讀響應文件
    /? 顯示幫助
    /help 顯示幫助
    /d[efine]:<symbols> 定義條件編譯符號
    /nologo 不顯示編譯器版權標志
    /print[+|-] 提供 print() 函數

    – 高級 –
    /codepage:<id> 使用指定的代碼頁 ID 打開源文件
    /lcid:<id> 將指定的 LCID 用於消息和默認代碼頁
    /nostdlib[+|-] 不導入標准庫(mscorlib.dll)並將 autoref 默認值更改為 off
    /utf8output[+|-] 以 UTF-8 字符編碼形式發出編譯器輸出
    /versionsafe[+|-] 為沒有標記為“override”或“hide”的成員指定默認值

打開vs命令行 運行 "jsc /t:library /out:d:\common.dll C:\common.js"

生成生成!!!

 

3.在c#項目中引用common.dll 和Micosoft.JScript.dll

 

 

4.   

 

xx x = new xx();

xx....

over。。。

 ???

果然還是報錯...

仔細又看了一遍:http://www.planabc.net/2011/06/04/use_jscript_to_create_windows_apps_and_libraries/

 

package LibHW {
class jsCommon{

    function b(a, b) {
        for (var d = 0; d < b.length - 2; d += 3) {
            var c = b.charAt(d + 2),
                c = "a" <= c ? c.charCodeAt(0) - 87 : Number(c),
                c = "+" == b.charAt(d + 1) ? a >>> c : a << c;
            a = "+" == b.charAt(d) ? a + c & 4294967295 : a ^ c
        }
        return a
    }

    function tk(a,TKK) {
        for (var e = TKK.split("."), h = Number(e[0]) || 0, g = [], d = 0, f = 0; f < a.length; f++) {
            var c = a.charCodeAt(f);
            128 > c ? g[d++] = c : (2048 > c ? g[d++] = c >> 6 | 192 : (55296 == (c & 64512) && f + 1 < a.length && 56320 == (a.charCodeAt(f + 1) & 64512) ? (c = 65536 + ((c & 1023) << 10) + (a.charCodeAt(++f) & 1023), g[d++] = c >> 18 | 240, g[d++] = c >> 12 & 63 | 128) : g[d++] = c >> 12 | 224, g[d++] = c >> 6 & 63 | 128), g[d++] = c & 63 | 128)
        }
        a = h;
        for (d = 0; d < g.length; d++) a += g[d], a = b(a, "+-a^+6");
        a = b(a, "+-3^+b+-f");
        a ^= Number(e[1]) || 0;
        0 > a && (a = (a & 2147483647) + 2147483648);
        a %= 1E6;
        return a.toString() + "." + (a ^ h)
    }
}
}

這次外邊又加了一個"package"...

終於可以了···GG

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM