关于dll的动态引用

epoluodi 2003-09-05 12:34:26
在com+的时代,引用一个com组件可以用菜单里面的引用,也可以动态的用createobject这个方法引用,这样当一个com组件不在的时候程序不会报错!
这是不是后期邦定!
那么现在在.net中编译的dll我想在其它的程序中引用是否可以动态的引用。
这样当这个dll不在的时候程序也可以运行!
...全文
18 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
好运 2003-09-05
  • 打赏
  • 举报
回复
.net中的如果没有引用编译通不过
ArLi2003 2003-09-05
  • 打赏
  • 举报
回复
//晕菜,回错贴了,不过这个例子也可以解释成 DLL 引用
//c# version if u can't unsafe

Module m = Assembly.GetExecutingAssembly().GetModule("myDLL.dll");
hHook = SetWindowsHookEx(WH_CBT,CBTProc,(HINSTANCE)Marshal.GetHINSTANCE(m).ToInt32(),NULL);
ArLi2003 2003-09-05
  • 打赏
  • 举报
回复
Module* mud = Assembly::GetExecutingAssembly()->GetModule("mydll.dll");
hHook = SetWindowsHookEx(WH_CBT,CBTProc,
(HINSTANCE)Marshal::GetHINSTANCE(mud).ToPointer(),NULL);
ArLi2003 2003-09-05
  • 打赏
  • 举报
回复
其实编写时引用也是可行的,如果你没有激活它的构造函数的话(没有实例化或静态调用)是不会影响到主程序体的,一样的运行,直到实例或静态调用时才会出错误提示(由jit 提供)
白掌柜 2003-09-05
  • 打赏
  • 举报
回复
这里有:
关于动态引用

http://developer.ccidnet.com/pub/disp/Article?columnID=340&articleID=8719&pageNO=1
ArLi2003 2003-09-05
  • 打赏
  • 举报
回复
引用时存在(可以选择不复制本地)可以通过编译,或者用 csc /r 来指定

编译后但它在运行时不存在时,将在实例化时出现错误提示,如果你没有在主form 上实例化它是没有关系的

动态调用可以用:

Assembly subAppAssembly = Assembly.LoadFrom(DLLFILENAME);
object newObject = subAppAssembly.CreateInstance(TYPEFULLNAME);

其中TYPEFULLNAME是你的namespace.class
也可以使用交叉引用,比如 myobj2 是 mewobject 的一个父集或者接口

myobj2 m = new myobj2(); type TYPEFULLNAME= m.GetType();
string mypath = Path.Combine(Application.StartupPath,"mewobject.dll");
Assembly subAppAssembly = Assembly.LoadFrom();
object newObject = subAppAssembly.CreateInstance(TYPEFULLNAME);
timmy3310 2003-09-05
  • 打赏
  • 举报
回复
可以动态引用,如:

System.Reflection.Assembly dll = System.Reflection.Assembly.LoadFrom("C:\\test.dll");

但是你在设计期不引用的话,不能够使用该Dll中定义的类型信息;不过通过设计一些接口还是可以做到的,比如,上面的test.dll中定义了一个:

namespace TestNamespace {
public class TestClass : ITest {
public TestClass() {}

public void GetTestString()
{
return "Hello";
}
}
}

ITest在其他地方(如应用程序和test.dll都引用的公用模块中)定义:
public interface ITest {
void GetTestString();
}

那么在应用程序中可以这样做:



System.Reflection.Assembly dll = System.Reflection.Assembly.LoadFrom("C:\\test.dll");

Type t = dll.GetType("TestNamespace.TestClass");
ITest obj = (ITest)Activator.CreateInstance(t);

string result = obj.GetTestString();

你可以看看我的文章:
http://expert.csdn.net/Expert/TopicView1.asp?id=2214138
epoluodi 2003-09-05
  • 打赏
  • 举报
回复
楼上详细说明一下阿!
ms44 2003-09-05
  • 打赏
  • 举报
回复
可以在需要的地方才直接引用啊:
System.Runtime.等等都可以啊
rqxiang 2003-09-05
  • 打赏
  • 举报
回复
赞成楼上!编译通过不了!!

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧