【问题标题】:Compilation error: object library invalid or contains references to object definitions that could not be found编译错误:对象库无效或包含对无法找到的对象定义的引用
【发布时间】:2016-11-25 11:48:04
【问题描述】:

我想从 Oracle 数据库中导入一些数据,但我不想将密码留在宏上,因为它很容易访问。然后我发现这段代码隐藏了我的连接字符串,它工作得很好,至少在我的电脑上是这样。我创建了下一个代码的 .dll,以便用户无法使用数据库数据。

using ADODB;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace HiddenConnectionString
{ 
  [InterfaceType(ComInterfaceType.InterfaceIsDual),
  Guid("2FCEF713-CD2E-4ACB-A9CE-E57E7F51E72E")]
  public interface IMyServer
{
    Connection GetConnection();
    void Shutdown();
}

[ClassInterface(ClassInterfaceType.None)]
[Guid("57BBEC44-C6E6-4E14-989A-B6DB7CF6FBEB")]
public class MyServer : IMyServer
{
    private Connection cn;
  
    private string cnStr = "Provider=MSDAORA.1;Password=YourPass;User ID=YourID;Data Source=IP:Port";
    public MyServer)(
    {

    }

    public Connection GetConnection()
    {
        cn = new Connection();
        cn.ConnectionString = cnStr;
        cn.Open();
        return cn;
    }

    public void Shutdown()
    {
        cn.Close();
    }
}
}

下一个代码是我要运行的代码:

Option Explicit

Sub Main()

Dim myCn As MyServer
Set myCn = New MyServer

Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset



'Consumos

rs.Open "select * from tablename, myCn.GetConnection


Sheets.Add After:=ActiveSheet
Range("A2").CopyFromRecordset rs


rs.Close
myCn.Shutdown

Set rs = Nothing
Set myCn = Nothing

End Sub

我一直试图让它在其他计算机上运行,​​但是当我在它们上运行测试代码时,我得到了这个错误:

编译错误:对象库无效或包含对无法找到的对象定义的引用

所以好像这个库还没有导入,但是当我查看参考列表时,我的“hiddenconnectionString.dll”被激活了,所以我不知道它是怎么回事。

有人可以给我一些关于如何使它工作的建议吗?欢迎任何帮助。谢谢:D

【问题讨论】:

    标签: vba dll reference azure-pipelines


    【解决方案1】:

    听起来 dll 只安装在您的机器上。参考列表中的项目不会导入和/或存储在 VBA 中。它们需要存在于每台主机上。

    我不确定隐藏的连接字符串是个好主意。 Security by obscurity 通常不鼓励使用,因为任何愿意投入足够时间的人通常都可以绕过它。

    此设计还使用共享的 UID 和 PWD。由于每个用户共享一个帐户,您将无法审核谁做了什么。

    如果可能,我始终建议为每个用户提供自己的帐户。

    【讨论】:

    • 我制作了 .dll 文件的副本并将其传递到保存 VBA 宏启用工作表的文件夹,所以... 似乎不是问题,如果这就是你的意思...我很欣赏您的建议,并且我了解无法以 100% 安全的方式使用 connectionString。但是恐怕我不能为每个用户创建一个帐户,因为他们需要一些特权才能对我的程序进行查询。如果“黑客”需要一些努力来获得 PASS 和 UID,我的程序就足够了,但我不希望它很容易到达。
    • 我以前见过这样的问题。如果您从非工作机器打开 references 对话框,Excel 是否会指出该引用已损坏?
    • 如果你的意思是“MISSING”不,它会检测到它,但它无法访问“myCn.GetConnection”功能
    • 我明白了。看起来您的 C# 包含对 ADO 的引用(类似于 Microsoft ActiveX 数据对象 x.x 库)。是否存在于故障机器上?
    • 是的...包括“Microsoft ActiveX 数据对象 2.8 库”!
    猜你喜欢
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 2021-05-19
    • 2011-01-01
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多