也许我在.NET中花了太多时间,但似乎奇怪的是我无法轻松地将当前的ADO RecordSet记录传递给另一种方法.
Private Sub ProcessData(data As ADODB.Recordset)
While (Not data.EOF)
ProcessRecord ([data.CurrentRecord]) ' <-- There is no CurrentRecord property.
data.MoveNext
Wend
End Sub
Private Sub ProcessRecord(singleRecord As ADODB.Record)
' Do stuff.
End Sub
Run Code Online (Sandbox Code Playgroud)
我在主题上找到的信息很少,表示要传递整个RecordSet或创建一个新记录并手动将每个字段复制到它.
StackOverflow,有更好的方法吗?
更新:在花了20多个小时尝试使一个简单的示例工作之后,我意识到这并不像看起来那样简单。诸如此类的文章揭示了“陷阱”-它是在Windows 7之前编写的(处理清单的方式有所不同)。我坚持通过VSTO将.NET程序集暴露给VBA 。
我制作了一个简单的COM-Visible .NET程序集,并试图从Excel VBA中调用它。如果我在.NET构建过程中“注册COM Interop”,则可以从VBA成功调用它。
Sub VBA()
Dim obj As Object
Set obj = actCtx.CreateObject("ComTest.Main")
MsgBox obj.Test() '<-- Displays "Hello"
End Sub
Run Code Online (Sandbox Code Playgroud)
但是,我想免注册。
根据汉斯的建议更新:
我取消选中``注册COM Interop'',然后将我的app.Manifest设置为:
Sub VBA()
Dim obj As Object
Set obj = actCtx.CreateObject("ComTest.Main")
MsgBox obj.Test() '<-- Displays "Hello"
End Sub
Run Code Online (Sandbox Code Playgroud)
我创建了一个虚拟的“ client.manifest”,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly
manifestVersion="1.0"
xmlns="urn:schemas-microsoft-com:asm.v1"
xmlns:asmv1="urn:schemas-microsoft-com:asm.v1"
xmlns:asmv2="urn:schemas-microsoft-com:asm.v2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<assemblyIdentity
type="win32"
version="1.0.0.0"
name="ComTest"
publicKeyToken="a36a7110110d7bd7" />
<clrClass
clsid="{975DC7E0-4596-4C42-9D0C-0601F86E3A1B}"
progid="ComTest.Main"
threadingModel="Both"
name="ComTest.Main"
runtimeVersion="v4.0.30319">
</clrClass>
<file name = "ComTest.dll"></file>
</asmv1:assembly>
Run Code Online (Sandbox Code Playgroud)
创建对象时,我修改了VBA以使用client.manifest: …
我有一个下载页面,其中包含指向本地存储在Web服务器上的文件的链接.当用户打开文本文件时,一切都很好,但当他们打开Office文件并从IE或Firefox中生成的对话框中选择"打开"时,ASP会创建一个新会话.
我简化的控制器方法是:
<HttpGet()>
<AppAuthorize(Domain.Security.TransactionId.Download)>
Public Function Download(fileName As String) As ActionResult
' fileName example: C:\ProgramData\MyCompany\MyApp\SomeFile.txt
Return New FilePathResult(fileName, "application/octet-stream")
End Function
Run Code Online (Sandbox Code Playgroud)
调试显示,只要在浏览器中单击"打开",就会触发Global.asax Session_Start()事件.

如果保存文件,然后在IE中查看它,则不会创建新会话.如果单击上图中的"打开"按钮,则只会出现问题.
为什么这样,我该如何预防呢?
核心问题是当我的应用程序看到新会话启动且用户具有有效的表单身份验证cookie时,它会假定IIS已重新启动并删除用户的cookie.因此,每次用户打开Word文档时,他们都会从应用程序中注销.