在一个类里调用,出现错误如下:System.Runtime.InteropServices.COMException: 服务器出现意外情况。移到webform的cs文件内,出现错误同上。将aspx内的aspcompact改为True,出现错误如下:
System.NullReferenceException: 未将对象引用设置到对象的实例。出现错误的是同一个语句。ActiveDLL:test.dll通过IDE添加引用以及命令方式TlbImp都尝试过,结果一样。
tell.DLL里有一个类class1,class1有一个方法GetWords(string constring,string s2),constring为ADO的连接字符串。
System.NullReferenceException: 未将对象引用设置到对象的实例。出现错误的是同一个语句。ActiveDLL:test.dll通过IDE添加引用以及命令方式TlbImp都尝试过,结果一样。
tell.DLL里有一个类class1,class1有一个方法GetWords(string constring,string s2),constring为ADO的连接字符串。
解决方案 »
- 各位大侠,如何实现文档内容与其行号的联动啊?
- C#的实时数据库问题
- 不会动的GIF。。
- 求:C#版 TreeView 建立部门树的实例
- C#中,用VS生成的Windows应用程序,为什么在桌面上无法运行?
- 高分求解关于 aspx.cs 后缀的问题?
- C# open xml编程excel中用到的NumberFormats需要添加上面引用啊?
- 请高手帮忙,竟然无法序列化一个 RSAParameter 实例 的 私匙形式, 而当实例为 公匙形式 时是可以序列化的
- 线程同步问题?(线程如何通信?)
- 请教socket传输的解决方法
- 水晶报表问题 如何设置图表中的标题颜色
- 怎么设计全球化的web站点,ASP.NE中有没有现成的方法
http://community.csdn.net/Expert/topic/4203/4203901.xml?temp=.2442285不会吧,难道以前VB做的,或者其他公司的产品,你们都不再用了?
在这里我们使用C#编写一个最简单的组件,仅仅实现返回一个字符串,详细的代码如下: 在上面的.NET组件当中我们实现了一个类成员:say。他的用途是简单的返回一段字符串。 切换到MS-DOS命令行下面,运行:
C:\>csc /t:library /out ClassLibrary1.DLLClassLibrary1.cs 上面的编译器参数/t:library 告诉C#编译器我们现在是在建立一个库应用程序。这样,我们就得到了一个名称为ClassLibrary1.DLL的.NET组件了。
但是想要在现有的COM组件中使用这个组件,我们还有进行如下步骤: 切换到MS-DOS命令行下面,运行:
C:\>regasm out ClassLibrary1.DLL /regfile:ClassLibrary1.reg 上面的命令行是注册我们的.NET组件,并且产生了一个备用的注册表文件。大家一定会记得在以前我们的win9x/NT/2000下面注册COM组件使用的命令是:
regsvr32 c:\test.dll 在.NET下面,注册.NET组件就需要上面的regasm命令了,值得注意的是,这个方法仅仅是为了可供COM组件来调用,.NET本身之间相互调用组件是不需要任何注册的! 还没有结束呢,接下来我们需要: 切换到MS-DOS命令行下面,运行:
C:\>tlbExp ClassLibrary1.dll /out:ClassLibrary1.tlb 上面的命令行表示将会产生一个.NET组件的类型库,目的是为了我们在COM组件中进行提前绑定操作。 好了,接下来我们就可以在自己的基于目前COM技术的代码中方便的使用上面我们使用C#编写的.NET组件了。在这里,我们使用VB6.0编写一个小小的测试代码,在开始之前我们需要在VB的集成环境中使用菜单中的“引用”选项,选择我们刚才产生的类型库文件ClassLibrary1.tlb。 VB测试的代码如下:
Private Sub Form_Load()
Dim test As New ClassLibrary1.hello
Dim str As String str = test.say("dddd")
MsgBox str
End Sub 接下来,我们就来看看,如何在.NET组件中使用目前存在的COM组件吧。 对于.NET来讲,使用COM组件要想对简单一些。.NET在设计之初就考虑到了如何方便的利用现有的各种技术资源,这也是微软的一贯作风,.NET的强大之处也可见一斑。.NET提供了大量的类库来方便的实现同COM的相互操作,其中很重要的一个名称空间就是:System.Runtime.InteropServices。通过这个名称空间的名字我们也可以从字面上看出,“互操作服务”。System.Runtime.InteropServices这个名称空间提供了一系列的类来对COM对象进行操作。 下面的例子中,我们来调用一下系统自带的Win32函数MessageBoxA,这个函数位于系统的COM组件user32.dll当中,我们调用的代码如下:
using System;
using System.Runtime.InteropServices; class Test
{
[DllImport("user32.dll")]
public static extern int MessageBoxA(inthWnd,string strMsg,string strCaption,intnType); public static void Main()
{
int myMsg;
myMsg=MessageBoxA(0,"Hello!","test",0);
}
} 切换到MS-DOS命令行下面,运行:
C:\>csc Test.cs 编译完毕我们的C#应用程序之后,直接运行就可以看到对话框了! 需要注意的是,在调用COM组件之前,我们需要在.NET程序中引用名称空间:System.Runtime.InteropServices。因为我们需要使用这个名称空间所提供的一个方法:DllImport。 怎么样,在.NET中使用COM组件是非常的方便的吧。上面是我们调用的系统本身自带的DLL组件,同样的,也可以使用这种方法来调用我们自己使用VB/VC编写的COM组件。 好了,我们已经探讨完了如何在.NET和COM之间相互操作了,我们也很显然的看到了.NET技术的强大,现在越早掌握.NET技术就会在未来越容易的占领领先的位置,让我们共同努力掌握强大的.NET平台技术吧。 (以上程序在Windows2000 server+VS.NET Beta2下测试通过)
[id(0x00000001), helpstring("method test")]
HRESULT test(
[in] BSTR s1,
[in] BSTR s2,
[out, retval] long* vtRet);该如何写?
我写成[PreserveSig] void test([In] MarshalAs(UnManagedType.Bstr) s1,
([In] MarshalAs(UnManagedType.Bstr) s1,
[Out] out int vtRet);
调用时这个vtRet该如何处理?如果去掉out,好像不能返回值。
[PreserveSig] void test([In] MarshalAs(UnManagedType.Bstr) s1,
[In] MarshalAs(UnManagedType.Bstr) s1,
[Out] out int vtRet);