在C#中,其實沒有OCX控件一說,相對應(yīng)的只是COM組件,編譯后也是.DLL,而不是.ocx.所以在C#中,在創(chuàng)建項目時只能創(chuàng)建類庫項目。
然后就是具體的代碼開發(fā)。(略)
要使組件成為能被網(wǎng)頁腳本調(diào)用的OCX控件,在開發(fā)時,要注意以下幾點:
1、必須要為將發(fā)布OCX控件的主類設(shè)置GUID碼。該碼在創(chuàng)建類庫時,C#會自動生成一個(你可以使用,也可以重新生成),并存儲在AssemblyInfo.cs中。設(shè)置GUID的代碼參照以下:
namespace xxxx
{
[Guid("8d7d8518-ca58-4863-b94d-3c616fda7b35")]//從AssemblyInfo.cs文件中直接復(fù)制過來
public partial class RunData : UserControl, IObjectSafety
{}
}
2、必須要實現(xiàn)IObjectSafety接口。該接口需要手工創(chuàng)建一個接口類并讓OCX組件實現(xiàn)。
完整的接口代碼:(以下接口代碼都是固定的,最好不要做其他改動)
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls.WebParts; //必須引用該包
using System.Security;
using System.Runtime.InteropServices; //必須引用該包
namespace RunData
{
///
/// 把控件發(fā)布成com組件時必須實現(xiàn)的接口.該接口的GUID是固定的,不能修改,否則組件發(fā)布不成功
///
[Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IObjectSafety
{
// 方法定義
void GetInterfacceSafyOptions(System.Int32 riid,out System.Int32 pdwSupportedOptions,out System.Int32 pdwEnabledOptions);
void SetInterfaceSafetyOptions(System.Int32 riid,System.Int32 dwOptionsSetMask,System.Int32 dwEnabledOptions);
}
}
接口實現(xiàn):
public void GetInterfacceSafyOptions(System.Int32 riid,out System.Int32 pdwSupportedOptions,out System.Int32 pdwEnabledOptions)
{
pdwSupportedOptions = 1; //不要修改該代碼
pdwEnabledOptions = 2; //不要修改該代碼
return;
}
public void SetInterfaceSafetyOptions(System.Int32 riid,System.Int32 dwOptionsSetMask,System.Int32 dwEnabledOptions)
{
return;
}
3、對AssemblyInfo.cs進(jìn)行編輯,修改相應(yīng)的屬性。包括以下屬性及值:
// 則將該類型上的 ComVisible 屬性設(shè)置為 true。
[assembly: ComVisible(true)] //將false更改為true,自動生成的注釋也做了說明
//新添加下面的屬性。該屬性要求引用System.Security
[assembly: AllowPartiallyTrustedCallers()]
// 如果此項目向 COM 公開,則下列 GUID 用于類型庫的 ID
//[assembly: Guid("80c07fca-841c-43c9-bd34-e9f3a6e87a85")] //注釋掉該屬性,此屬性必須注釋,最初我沒有注釋此屬性,生成COM組件老是不成功,有警告,會影響最后的發(fā)布.試了N次才試出原因是沒有注釋此屬性。
要引用:using System.Runtime.InteropServices;
4、編輯工程屬性。
A、在[應(yīng)用程序]頁,輸出類型必須指定為“類庫”.
B、在[生成]頁,必須勾選“為Com Interop注冊”選項。
作了以上修改,如果能編譯成功,則表示你的COM組件已夠在你本機(jī)發(fā)布成功了。也說明你的組件本身沒什么問題了。
你可以寫一個測試網(wǎng)頁對你的COM組件進(jìn)行引用了。
如果是IIS,可以直接使用DLL引用方式進(jìn)行引用,格式:
也可以使用clsid方式引用。
如果非IIS應(yīng)用服務(wù)器,如tomcat等,則只能使用CLSID方式。格式:
"8d7d8518-ca58-4863-b94d-3c616fda7b35"就是最開始提到的那個GUID碼!
在本機(jī)上運(yùn)行此網(wǎng)頁應(yīng)該不會出現(xiàn)問題了,因為在開發(fā)組件的過程中VS.NET會自動進(jìn)行組件注冊。
使用OLE查看器可以查看當(dāng)前組件是否成功注冊到本機(jī),如果沒有找到該組件,應(yīng)該使用手工注冊方式進(jìn)行注冊。
通常情況下手工注冊O(shè)CX都是采用RegSvr32.exe,但注冊C#編寫的COM組件推薦使用.NET自帶的注冊工具RrgAsm.exe工具,而且使用的注冊工具版本一定要與開發(fā)框架版本一起發(fā)布的版本
網(wǎng)站建設(shè)公司,為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計及定制網(wǎng)站建設(shè)服務(wù),專注于企業(yè)網(wǎng)站建設(shè),高端網(wǎng)頁制作,對成都工商代辦等多個行業(yè)擁有豐富的網(wǎng)站建設(shè)經(jīng)驗的網(wǎng)站建設(shè)公司。專業(yè)網(wǎng)站設(shè)計,網(wǎng)站優(yōu)化推廣哪家好,專業(yè)成都網(wǎng)站營銷優(yōu)化,H5建站,響應(yīng)式網(wǎng)站。