惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
L
Lohrmann on Cybersecurity
aimingoo的专栏
aimingoo的专栏
V
V2EX
S
Security Affairs
T
Threatpost
C
CXSECURITY Database RSS Feed - CXSecurity.com
IT之家
IT之家
J
Java Code Geeks
The Register - Security
The Register - Security
U
Unit 42
C
CERT Recently Published Vulnerability Notes
月光博客
月光博客
A
About on SuperTechFans
H
Hackread – Cybersecurity News, Data Breaches, AI and More
T
The Blog of Author Tim Ferriss
Cisco Talos Blog
Cisco Talos Blog
Project Zero
Project Zero
S
Schneier on Security
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
D
DataBreaches.Net
博客园 - 司徒正美
V
Vulnerabilities – Threatpost
T
Tor Project blog
Security Latest
Security Latest
T
The Exploit Database - CXSecurity.com
T
Threat Research - Cisco Blogs
Scott Helme
Scott Helme
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
M
MIT News - Artificial intelligence
云风的 BLOG
云风的 BLOG
小众软件
小众软件
L
LangChain Blog
Attack and Defense Labs
Attack and Defense Labs
Recent Commits to openclaw:main
Recent Commits to openclaw:main
P
Palo Alto Networks Blog
A
Arctic Wolf
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
C
Cyber Attacks, Cyber Crime and Cyber Security
博客园 - 叶小钗
D
Darknet – Hacking Tools, Hacker News & Cyber Security
L
LINUX DO - 最新话题
MongoDB | Blog
MongoDB | Blog
Webroot Blog
Webroot Blog
H
Hacker News: Front Page
Know Your Adversary
Know Your Adversary
Spread Privacy
Spread Privacy
AWS News Blog
AWS News Blog
Engineering at Meta
Engineering at Meta

博客园 - Blueeyes

挺有意思的小工具。。。 笔记本CPU大全 搜集整理的一些SQL语句 .NET程序脱离.NET框架的方法 ASP.NET3.5的ListView与CSS Friendly ASP.NET页面中标题单点解决方案 微软一个罕为人知的无敌命令ntsd 微软一个罕为人知的无敌命令ntsd 全国主要城市的DNS服务器列表 静态构造器四个准则 .NET 中的对象序列化 .NET 中的数字格式化,日期格式化 别有用心的SQL 向水晶报表传递参数 在GridView的中有一个DropDownList,并且DropDownList有回传事件 纯CSS文字阴影效果实现 Excel轻松合并 写了一个查看SQL表结构的小工具 gridview的简单示例 (个人收藏)
JS调用c#编写的DLL
Blueeyes · 2010-12-15 · via 博客园 - Blueeyes

一个简单的办法是用WebBrowser做媒介,作为网页的宿主对象,继而通过将控件的ObjectForScripting赋值为当前窗体对象,通过窗体对象去引申调用C#项目里的其他文件。

可是,往往我们不需要通过窗体里面套WebBrowser来解决,那窗体有时候也不需要么。OK,那我隐藏掉窗体,隐藏掉所有……呵呵,太牵强了总也能行可那总归是牵强。

本文给大家提供一种设计思路,不见得完全适用(微软的机器可以),但望能抛砖引玉,期望高人提出更好的解决方案。

下面,引入正题:将C#编写的DLL已COM组件形式注册,再由JS调用

 首先做准备工作:

1、为您的VS添加OLE/COM Object View工具

“工具>>外部工具”,点击添加,选择路径,默认在“C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\Bin\OleView.Exe”(我的版本是VS2005 Team Suit)。填好相应参数就OK了。

JS怎样调用c编写的DLL - 龙鲤 - 有意栽花花不放 无心插柳柳成荫

2、创建一个类库项目,命名为DllCOMDemo

3、开始编码,类Demo.cs

代码:

JS怎样调用c编写的DLL - 龙鲤 - 有意栽花花不放 无心插柳柳成荫

COM组件需要引用接口实现;GUID为COM的clasid;

GUID要通过以下方式创建:

点击“工具>>创建GUID”,如图:

JS怎样调用c编写的DLL - 龙鲤 - 有意栽花花不放 无心插柳柳成荫

 4、设置程序集属性:

勾选“使程序集COM可见”,如下图

JS怎样调用c编写的DLL - 龙鲤 - 有意栽花花不放 无心插柳柳成荫

或者在AssemblyInfo.cs文件里面修改“[assembly: ComVisible(true)]”。

同时,在“生成”里面勾选“为COM Interop注册”。

5、生成项目,这时您就可以通过刚才添加的OLE View工具查看了。注意,COM组件的clsid为C#里面类(Demo.cs)上面的GUID。

默认在".NET Category"节点下查看,名称为您的程序集名称,如“DllCOMDemo.Demo”。

在选中的节点上右键选择“Copy HTML <object> Tag to Clipboard”,将COM组件的html代码复制到剪切板中。

6、创建TestDll.htm

 JS怎样调用c编写的DLL - 龙鲤 - 有意栽花花不放 无心插柳柳成荫

7、效果

JS怎样调用c编写的DLL - 龙鲤 - 有意栽花花不放 无心插柳柳成荫

这样子,我们就可以通过将C#代码注册成COM组件的形式来实现JS调用C#了。

以上是自动注册。

如果要手动注册COM组件(无论哪种注册方式“使程序集COM可见”必须设置为true),需要用到regasm.exe,默认%Windows\\Microsoft.NET\Framework\v2.0.50727%目录下。使用此命令注册时需要首先将程序集定义为“强程序集”,您可以使用al.exe为您的程序集产生一个密钥文件。这样,当您使用regasm注册时会自动在所在文件夹下自动搜索密钥文件注册。

如果使用regasm命令注册失败,请附带 /codebase参数。

如:regasm DllCOMDemo.dll /codebase DllCOMDemo.dll

 同样,我们也可以通过这种思路将C#中的自定义控件以COM组件形式注册,然后在html页面内使用。当然,这个意义似乎不重要。

Demo.cs类代码

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace DllCOMDemo
{
    [Guid("369588B3-0AC7-43fb-AB02-D92E9AC744AC")]
    public interface IDemo
    {
        string Name          { get;set;}
        string Gender        { get;set;}
        DateTime Birthday    { get;set;}
        int GetAge();
        string GetManInformation();
    }

    [Guid("437081BB-3023-49e7-9461-55326F08C44E")]
    public class Demo : IDemo
    {
        string name = "华骨龙";
        string gender = "男";
        DateTime birthday = new DateTime(1987, 2, 8);

        public string Name { get { return this.name; } set { this.name = value; } }
        public string Gender { get { return this.gender; } set { this.gender = value; } }
        public DateTime Birthday { get { return this.birthday; } set { this.birthday = value; } }

        public int GetAge() { return DateTime.Now.Year - this.Birthday.Year; }
        public string GetManInformation(){
            return string.Format("姓名:{0};年龄:{1};性别:{2};生日:{3}", Name,GetAge(),Gender,Birthday);
        }
        public string SayHello(string name){ return "【Message from C# DLL】Hello " + name ; }
    }
}

 TestDll.htm代码

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> JS调用C#编写的DLL测试 </TITLE>
 </HEAD>

 <BODY>
 <script type="text/javascript" language="javascript">
 function GetManInfor(){
 lblinfor.innerHTML += "点击“" + event.srcElement.value + "”>>>"
 + csObj.GetManInformation() + "<br />";
 }
 function SetCSObj(){
 csObj.Name   = "雨露思恋";
 csObj.Gender  = "男";
 csObj.Birthday  = "1980-05-20";
 lblinfor.innerHTML += "Initialization Success!" + "<br />";
 }
 function GetAge(){
 lblinfor.innerHTML += "点击“" + event.srcElement.value + "”>>>" + csObj.Name
 + "的年龄是:" + csObj.GetAge() + "<br />";
 }
 function SayHello(){
 lblinfor.innerHTML += "点击“" + event.srcElement.value + "”>>>"
 + csObj.SayHello("Tom") + "<br />";
 }
 </script>
  <object id="csObj" classid="clsid:437081BB-3023-49E7-9461-55326F08C44E" style="width:0;height:0"></object>
  <input type="button" value="获取默认属性" onclick="GetManInfor()" />
  <input type="button" value="自定义设置" onclick="SetCSObj()" />
  <input type="button" value="重新读取" onclick="GetManInfor()" />
  <input type="button" value="获取年龄" onclick="GetAge()" />
  <input type="button" value="Say Hello To Tom" onclick="SayHello()" />
  <br /><br /><br />
  <span id="lblinfor" />
 </BODY>
</HTML>