相关疑难解决方法(0)

注册没有管理员权限/ regasm的.Net COM DLL

最近,我在C#中编写了一个类库,用于Office应用程序,包括约70人使用的关键Access应用程序.对于具有管理员权限的用户,注册DLL很简单,但让DLL在其他计算机上运行是有问题的.

注册DLL以使用管理员权限

  • 在Visual Studio中构建DLL.确保在项目的" 应用程序"选项卡上选择了这些选项:
    • 输出类型:类库
    • 装配信息:使装配COM可见:已检查
  • 使用提升的命令提示符注册程序集:
    • RegAsm YourDll.dll /tlb /codebase
  • YourDll.tlb在VBA中添加引用:工具 - >引用
  • 验证您是否可以创建对象的实例

怎么了?

Regasm在这里做了几件事.首先,它创建了一个类型库(YourDLL.tlb),它提供有关DLL中的类的信息.其次,它将有关库的信息存储在注册表中,以便系统"知道"当您要求将类实例化为对象时的含义.

要查看Regasm添加的注册表项,可以使用以下/regfile参数运行它:

Regasm YourDLL.dll /codebase /regfile

(该/regfile选项对/tlb参数无效.)

如果该/codebase选项告诉Regasm包含有关YourDLL.dll磁盘位置的信息,这对于创建对象很重要.

如果您YourDLL.reg在文本编辑器中打开,您将看到Regasm添加到注册表的条目:条目HKEY_Classes_Root(实际上只是重定向到HKLM\Software\Classes).不幸的是,您需要管理员权限才能修改HKLM,因此这对我们的其他用户无效.

还有一些其他线程(例如,注册没有管理员权限的COM,注册COM DLL供VBA使用,注册DLL(ActiveX)用于非管理员用户,无法注册.NET COM DLL,COM Interop没有regasm)讨论问题,但他们的解决方案是复杂的(例如需要注册表重定向)或不完整(假设你已经知道至少一半的答案)或不适用于混合64/32位环境(例如Win64,Office32).

那么如何在没有管理权限的情况下注册在Visual Studio中创建的COM DLL,以便在当前用户的VBA 32和64位环境中使用?

.net registry dll vba regasm

17
推荐指数
2
解决办法
7298
查看次数

从vba调用.net库方法

我在ASP.net,c#中开发了一个Web服务,并在IIS上托管,由vba客户端使用.下载了Office 2003 Web Services 2.01工具包后,我遇到了成功创建所需代理类的问题(许多用户在线记录),并决定创建一个.net DLL库.我创建了一个库,它引用了Web服务并将其中一个方法暴露给c#中的公共函数.

我现在有三个问题:

  1. 如何在VBA中引用dll类?我试图去工具 - >引用并浏览到dll位置,但是我收到错误"无法添加对指定文件的引用".磁盘上是否有特定位置我必须复制.dll?

  2. 我还可以复制dll文件旁边的dll.config文件,以便在那里使用端点URL吗?

  3. 由于要调用的方法是接受一个对象(由各种成员和几个List <>成员组成,这些如何在VBA代码中实现?

.net com vba com-callable-wrapper

14
推荐指数
1
解决办法
1万
查看次数

像Microsoft Access(VBA)的通知一样非阻塞"吐司"

我要去ASK并回答我认为对MS Access中一些很酷的UI功能感兴趣的人有用的问题. 回答自己的问题

问题: 如何在Microsoft Access中显示非阻塞"吐司"之类的通知?确实有一些动画,不应该阻止主机应用程序!

ms-access notifications vba nonblocking access-vba

12
推荐指数
1
解决办法
1685
查看次数

在VBA中按键对字典排序

我已经在VBA中创建了一个字典,使用CreateObject("Scripting.Dictionary")映射源词来定位要在某些文本中替换的单词(这实际上是用于混淆).

不幸的是,当我按照下面的代码进行实际替换时,它将按照添加到字典中的顺序替换源字.如果我那么例如"蓝色"然后是"蓝莓",则"蓝莓"中的"蓝色"部分被第一个目标替换,"贝瑞"保持不变.

'This is where I replace the values
For Each curKey In dctRepl.keys()
    largeTxt = Replace(largeTxt, curKey, dctRepl(curKey))
Next
Run Code Online (Sandbox Code Playgroud)

我想我可以通过首先将字典的从最长到最短的长度排序然后如上所述进行替换来解决这个问题.问题是我不知道如何按这种方式对键进行排序.

excel vba dictionary excel-vba

9
推荐指数
2
解决办法
3万
查看次数

使用C#编写的COM加载项与自动加载项的可选参数

我正在开发一个COM加载项和Excel自动化加载项库,其核心代码是用C#编写的.我想为函数设置一个可选参数,我知道这对于C#和VBA,甚至Excel WorksheetFunction都是合法的.但我发现最终可选参数专门用于COM和Automation加载项,这意味着如果首先运行一个加载项,那么效果很好但另一个加载项的可选参数将不起作用.

下面请看示例:

在VS 2013解决方案中,我有两个项目:一个被调用TestVBA,另一个被调用TestExcel.

TestVBA用于COM加载项并通过"Excel 2013加载项"构建,有两个.cs文件:

  1. ThisAddIn.cs

此文件自动生成并稍作修改.代码是

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;
using Microsoft.Office.Tools.Excel;

namespace TestVBA
{
    public partial class ThisAddIn
    {
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
        }

        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
        }

        private ExcelVBA oExcelVBA;

        protected override object RequestComAddInAutomationService()
        {
            if (oExcelVBA == null)
            {
                oExcelVBA = new ExcelVBA();
            }
            return oExcelVBA; …
Run Code Online (Sandbox Code Playgroud)

c# excel vsto add-in excel-addins

6
推荐指数
1
解决办法
352
查看次数