我在循环中创建了一个新对象,并将该对象添加到集合中; 但是当我读回之后,它总是被我添加的最后一个对象填满.我想出了两种解决方法,但我根本不明白为什么我的初始实现是错误的.
原版的:
Dim oItem As Variant
Dim sOutput As String
Dim i As Integer
Dim oCollection As New Collection
For i = 0 To 10
Dim oMatch As New clsMatch
oMatch.setLineNumber i
oCollection.Add oMatch
Next
For Each oItem In oCollection
sOutput = sOutput & "[" & oItem.lineNumber & "]"
Next
MsgBox sOutput
Run Code Online (Sandbox Code Playgroud)
这导致每行数为10; 我显然没有创建新对象,而是每次通过循环使用相同的对象,尽管声明在循环内部.
所以,我在行Set oMatch = Nothing之前立即添加Next,这解决了问题,它现在是0到10.所以如果旧对象被明确销毁,那么它是否愿意创建一个新对象?我原以为通过循环的下一次迭代会导致循环中声明的任何东西因范围而被破坏?
好奇,我尝试了另一种声明新对象的方法:Dim oMatch As clsMatch: Set oMatch = New clsMatch.这也导致0到10.
任何人都可以向我解释为什么第一次实施是错误的?
我使用.NET 3.0框架在C#中创建了一个DLL.
下面是我的DLL的代码
namespace CompanyName.Net
{
[Guid("F7075E8D-A6BD-4590-A3B5-7728C94E372F")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ProgId("CompanyName.Net.Webrequest")]
public class WebRequest
{
public string Result { get; private set; }
public string Url { get; set; }
public string StatusDescription { get; private set; }
public HttpStatusCode StatusCode { get; private set; }
public WebRequest()
{
//explicit constructor
}
public string GetResponse(string url)
{
System.Net.WebRequest webreq = System.Net.WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse) webreq.GetResponse();
// Store the status.
StatusDescription = response.StatusDescription;
StatusCode = response.StatusCode;
// Get the stream containing content …Run Code Online (Sandbox Code Playgroud) 我正在为学校建立软件的软件公司,所以我们的客户端机器通常被锁定,这使得我们几乎不可能在其上安装任何东西.
我们的旧系统主要基于(非常大的)MS Access项目,因此只需从本地文件夹运行即可解决访问问题.
我已经被赋予了将一些系统重新开发到c#.NET的任务 - 但是在过渡阶段能够让访问项目解开.NET事件会很好.
我今天玩了几个小时的com interops但是afaik使这些工作的唯一方法是用RegAsm.exe注册它们 - 不幸的是,这不是客户端环境中的一个选项.
我已经尝试过GetObject/CreateObject但在引用dll或tlb文件时都不起作用,还有其他方法可以实现吗?
理想的解决方案是将com interop dll放在与Access项目相同的目录中.
是的,在有人说之前,我知道MS Access是邪恶的,只适用于非常小的项目 - 但我4个月前才来到这里......
马龙