C#动态加载程序集问题 高分求解

C#动态加载程序集问题 高分求解,第1张

我先说下你想要的结果,你把AssemblyLoadFrom换成AssemblyLoadFile即可。

另外,你既然能够在你的应用中使用AssemblyLoadFrom这样的方法,那test1dll他们的路径就是已知的了,何必还要通过反射程序集内部方法来获取它的Location呢?

如果你是将test1dll注册到了全局环境中,那么我建议你不要使用LoadFrom和LoadFile,改用Load方法:将test1和test2通过版本号或者公钥(PublicKey)加以区别,然后用Load方法调用。调用参数类似于:“程序集名,Version=版本1,culture=区域信息1,PublicKeyToken=公钥1”,这是微软标准的做法。

javaScript函数中执行C#代码中的函数:

方法一:1、首先建立一个按钮,在后台将调用或处理的内容写入button_click中;

2、在前台写一个js函数,内容为documentgetElementById("btn1")click();

3、在前台或后台调用js函数,激发click事件,等于访问后台c#函数;

方法二:1、函数声明为public

后台代码(把public改成protected也可以)

public string ss()

{

return("a");

}

2、在html里用<%=fucntion()%>可以调用

前台脚本

<script language=javascript>

var a = "<%=ss()%>";

alert(a);

</script>

方法三:1、<script language="javascript">

<!--

function __doPostBack(eventTarget, eventArgument)

{

var theForm = documentForm1; //指runat=server的form

theForm__EVENTTARGETvalue = eventTarget;

theFrom__EVENTARGUMENTvalue = eventArgument;

theFormsubmit();

}

-->

</script>

<input id="Button1" type="button" name="Button1" value="按钮" onclick="javascript:__doPostBack('Button1','')">

方法四:<script language="javascript">

function SubmitKeyClick()

{

if (eventkeyCode == 13)

{

eventcancelBubble = true;

eventreturnValue = false;

documentallFunNamevalue="你要调用的函数名";

documentform[0]submit();

}

}

</script>

<INPUT onkeypress="SubmitKeyClick()" id="aaa" type="text">

<input type="hidden" name="FunName"> 〈!--用来存储你要调用的函数 --〉

在CS里有:

public Page_OnLoad()

{

if (!PageIsPost())

{

string strFunName=RequestForm["FunName"]!=nullRequestForm["FunName"]:"";

//根据传回来的值决定调用哪个函数

switch(strFunName)

{

case "enter()":

enter() ; //调用该函数

break;

case "其他":

//调用其他函数

break;

default:

//调用默认函数

break;

}

}

}

public void enter()

{

//……比如计算某值

}

呵呵,学习资料里的,不知出处,还请作者原谅

可以通过多种方式将程序集加载到应用程序域中。推荐方式是使用SystemReflectionAssembly类的static(在 Visual Basic 中为Shared)Load方法。加载程序集的其他方式包括:Assembly类的LoadFrom方法加载已给定其文件位置的程序集。通过此方法加载程序集将使用不同的加载上下文。ReflectionOnlyLoad和ReflectionOnlyLoadFrom将程序集加载到仅反射上下文中。注意仅反射上下文是 NET Framework 20 版中的新增功能。诸如CreateInstance方法和AppDomain类的CreateInstanceAndUnwrap之类的方法可将程序集加载到应用程序域中。Type类的GetType方法可加载程序集。SystemAppDomain类的Load方法可以加载程序集,但该方法主要用于 COM 互 *** 作性。不应使用该方法将程序集加载到除从其调用该方法的应用程序域以外的其他应用程序域。注意从 NET Framework 20 版开始,对于版本号高于当前已加载运行库的 NET Framework 版本,运行库将不加载由其进行编译的程序集。这同样适用于主版本号和次版本号的组合。可以指定在应用程序域间共享来自已加载程序集的实时 (JIT) 编译代码的方式。有关更多信息,请参见应用程序域和程序集。示例下面的代码将名为exampleexe或exampledll的程序集加载到当前应用程序域中,从该程序集获取名为Example的类型,为该类型获取名为MethodA的无参数方法,然后执行该方法。有关从所加载程序集中获取信息的完整讨论,请参见动态加载和使用类型。

我们都知道,调用WS可以在工程中添加对WS的WEB引用。

但是,如果我们不想通过添加引用的方式,而是在代码中动态引用该怎么办呢?

首先,我们该想到WS的实现也是一个类的形式。

其次,WS在传输过程中是通过WSDL来进行描述的(使用SOAP协议)。

因此,我们需要获取WS的WSDL描述,并通过该描述来动态生成程序集。

最后:通过反射来获取新生成的程序集,并调用其方法!

上述步骤需要引用如下四个名称空间:

using SystemWebServicesDescription; //WS的描述

//以下几个用于根据描述动态生成代码并动态编译获取程序集

using SystemCodeDom;

using MicrosoftCSharp;

using SystemCodeDomCompiler;

上述几个名称空间中包括如下几个重要的类:

using SystemWebServicesDescription下:

ServiceDescription //WS描述

ServiceDescriptionImporter //通过描述生成客户端代理类,特别注意其中的Style

以下是MSDN对其的描述:

XML Web services 的接口通常由 Web 服务描述语言 (WSDL) 文件来说明。例如,若要获取有关使用 处公开的 ASPNET 的 Web 服务的 WSDL 说明,只需导航到 WSDL。使用 ServiceDescriptionImporter 类可以方便地将 WSDL 说明中包含的信息导入到SystemCodeDomCodeCompileUnit 对象。通过调整 Style 参数的值,可以指示 ServiceDescriptionImporter 实例生成客户端代理类(通过透明调用该类可提供 Web 服务的功能)或生成抽象类(该类封装 Web 服务的功能而不实现该功能)。如果将 Style 属性设置为 Client,则 ServiceDescriptionImporter 生成客户端代理类,通过调用这些类来提供说明的 Web 服务的功能。如果将Style 属性设置为 Server,则 ServiceDescriptionImporter 实例生成抽象类,这些类表示所说明的 XML Web services 的功能而不进行实现。然后,可以通过编写从这些抽象类继承的类来对其进行实现,并实现相关的方法。

using SystemCodeDom下:

CodedomUnit //它用于设定动态代码的名称空间,类名等,可以通过ServiceDescriptionImporterImport()方法将WS的描述代码写入该类,以作动态编译用

using SystemCodeDomCompiler下:

CodedomProvider //用于创建和检索代码生成器和代码编译器的实例,我们主要用到其实现子类CShareCodeProvider

可以直接用CShareCodeProvider provider=new CShareCodeProvider()来生成,或者用CodedomProviderCreateProvider("CSharp")来生成

ICodeCompiler //用于编译基于 SystemCodeDom 的源代码表示形式。

它通过CodedomProvider的CreateCompiler()方法来

CompilerResults //表示从编译器返回的编译结果。 它由ICodeCompiler根据指定的编译器设置从指定的 CodeCompileUnit 所包含的 SystemCodeDom 树中编译程序集并返回。CompiledAssembly 属性指示编译的程序集。

了解如上信息后,就可动态调用WS了。

程序集注册工具读取程序集中的元数据,并将所需的项添加到注册表中。注册表允许 COM 客户程序以透明方式创建 NET Framework 类。类一经注册,任何 COM 客户程序都可以使用它,就好像该类是一个 COM 类。类仅在安装程序集时注册一次。程序集中的类实例直到被实际注册时,才能从 COM 中创建。

regasm assemblyFile [options]

参数

参数 说明

assemblyFile

要向 COM 注册的程序集。

选项 说明

/codebase

在注册表中创建一个 Codebase 项。Codebase 项指定未安装到全局程序集缓存中的程序集的文件路径。如果随后要安装正在注册到全局程序集缓存中的程序集,则不应指定此选项。用 /codebase 选项指定的 assemblyFile 参数必须是具有强名称的程序集。

/registered

指定此工具将仅引用已经注册的类型库。

/asmpath:directory

指定包含程序集引用的目录。必须和 /regfile 选项一起使用。

/nologo

取消显示 Microsoft 启动标题。

/regfile [:regFile]

为程序集生成指定的 reg 文件,该文件包含所需的注册表项。指定此选项不更改注册表。此选项不能与 /u 选项或 /tlb 选项一起使用。

/silent 或 /s

取消显示成功消息。

/tlb [:typeLibFile]

从指定的程序集生成类型库,该类型库包含在程序集中定义的可访问类型的定义。

/unregister 或 /u

注销在 assemblyFile 中找到的可创建类。省略此选项将导致 Regasmexe 注册程序集中的可创建类。

/verbose

指定详细模式;当用 /tlb 选项指定时,显示所有需要为其生成类型库的引用程序集的列表。

/ 或 /help

显示该工具的命令语法和选项。

Note注意

Regasmexe 命令行选项不区分大小写。只需提供足够的选项来唯一标识它。例如,/n 等效于 /nologo,而 /t:outfiletlb 等效于 /tlb:outfiletlb。

以上就是关于C#动态加载程序集问题 高分求解全部的内容,包括:C#动态加载程序集问题 高分求解、net中如何读取dll中所有函数、C#如何将程序集加载到应用程序域中等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9595018.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存