怎么样用C#不注册调用C++写的DLL控件

passport4jedliu 2010-05-24 11:09:08
有一个别人写的DLL控件(有代码的,改写了一部分关键代码,可以编译),C#中要调用DLL的对象,但是需要通过regsvr32注册后才可以调用。如果不注册就会提示:
错误 CS0246: 找不到类型或命名空间名称“xxx”(是否缺少 using 指令或程序集引用?)


运行程序的话CLSD没有注册这样。

现在希望可以不注册调用这个C++控件对象。本人的思路是,能否将这个DLL加载到内存中,然后在内存中注册,不是直接注册到系统中。

主要的目的是能够创建单文件的exe执行程序,能够保证这个DLL控件的代码的安全性。

恳请指教,在此谢过。

这个是一个项目中使用的,如果有高人可以告知,愿意在猪八戒网站上开任务支付部分协助的费用。
...全文
436 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Joetao 2010-05-25
  • 打赏
  • 举报
回复
不知道这个方法能不能满足楼主要求
调用Regsvr32法

  既然可以在运行栏中输入“Regsvr32.exe 路径”的方法来注册,那么,一定可以在C#程序中采用同样的方法来调用Regsvr32,以实现注册:
Process p = new Process(); p.StartInfo.FileName = "Regsvr32.exe"; p.StartInfo.Arguments = "/s C:\\DllTest.dll";//
路径中不能有空格 p.Start(); 采用这种方法,注意要添加对命名空间System.Diagnostics的引用:

参考:http://tech.it168.com/a2010/0319/863/000000863056.shtml
passport4jedliu 2010-05-25
  • 打赏
  • 举报
回复
没有其他的办法可以来创建单个exe文件,而不需要在用到机器上注册这种com组件么?

像我提到的那样,将DLL加载到内存中,然后再内存中注册,是否可以显示呢?
OnlyOB 2010-05-25
  • 打赏
  • 举报
回复
不注册不能使用的!!!
Joetao 2010-05-25
  • 打赏
  • 举报
回复
很有可能是用的com组件,还有*.ocx等也是要注册了才能使用的。
gomoku 2010-05-25
  • 打赏
  • 举报
回复
有两种方法:

1、简单的方法是用配置清单来指定如何激活(免注册的)COM对象,步骤和例子见MSDN文章:
Registration-Free Activation of COM Components: A Walkthrough

2、另外一种是自己模拟COM激活的过程。ComClass都会导出DllGetClassObject函数,自己DllImport并调用该函数,然后转换为COM接口。
snoring 2010-05-25
  • 打赏
  • 举报
回复
如果调用API太多,就用C++开发
li45214521 2010-05-24
  • 打赏
  • 举报
回复
你那是COM组件
不注册不能使用的
就连C++也不能使用的
passport4jedliu 2010-05-24
  • 打赏
  • 举报
回复
DllImport 我倒是知道,可是这个DLL在C#调用的时候,感觉就是在调用一个对象一样,不是DllImport一个DLL的函数来调用。只要注册这个DLL,就可以在C#中直接调用这个对象。
捷哥1999 2010-05-24
  • 打赏
  • 举报
回复
用DllImport关键字,将dll放在exe所在目录下,就可以了,请参考:

DllImport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL导出的函数的必要调用信息。
DllImport属性应用于方法,要求最少要提供包含入口点的dll的名称。
DllImport的定义如下:

[AttributeUsage(AttributeTargets.Method)]
  public class DllImportAttribute: System.Attribute
  {
   public DllImportAttribute(string dllName) {…} //定位参数为dllName
   public CallingConvention CallingConvention; //入口点调用约定
   public CharSet CharSet; //入口点采用的字符接
   public string EntryPoint; //入口点名称
   public bool ExactSpelling; //是否必须与指示的入口点拼写完全一致,默认false
   public bool PreserveSig; //方法的签名是被保留还是被转换
   public bool SetLastError; //FindLastError方法的返回值保存在这里
   public string Value { get {…} }
  }
用法示例:
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section,string key,string val,string filePath);
以上是用来写入ini文件的一个win32api。

用此方式调用Win32API的数据类型对应:DWORD=int或uint,BOOL=bool,预定义常量=enum,结构=struct。

DllImport会按照顺序自动去寻找的地方:
1、exe所在目录
2、System32目录
3、环境变量目录
所以只需要你把引用的DLL 拷贝到这三个目录下 就可以不用写路径了
或者可以这样server.MapPath(.\bin\*.dll)

110,578

社区成员

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

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

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