从GAC中注册的COM可见DLL访问非COM可见DLL方法

从GAC中注册的COM可见DLL访问非COM可见DLL方法,dll,com,gac,com+,dllregistration,Dll,Com,Gac,Com+,Dllregistration,我的网站应用程序使用在特定身份下运行的C#COM+组件来访问SQL Server,从经典ASP 还有一个web服务,它在网站应用程序中使用\bin DLL,该DLL包含将一些数据插入SQL Server数据库的方法(我们称之为MyApp.database.DLL) 从网站前端,我希望能够为经过身份验证的用户提供相同的功能 由于明显的原因,我不想在COM+组件中复制MyApp.Database.dll中的代码 我的想法是利用ASP的COM+组件调用MyApp.Database.dll方法,使用应用

我的网站应用程序使用在特定身份下运行的C#COM+组件来访问SQL Server,从经典ASP

还有一个web服务,它在网站应用程序中使用\bin DLL,该DLL包含将一些数据插入SQL Server数据库的方法(我们称之为MyApp.database.DLL

从网站前端,我希望能够为经过身份验证的用户提供相同的功能

由于明显的原因,我不想在COM+组件中复制MyApp.Database.dll中的代码

我的想法是利用ASP的COM+组件调用MyApp.Database.dll方法,使用应用程序凭据访问SQL数据库,因为ASP是以用户身份运行的,无法访问SQL Server

我似乎遇到的问题是,尽管我可以在COM+组件项目中引用MyApp.Database.dll(在“References”和“using MyApp.Database.dll”下),但在实际运行或调试COM+组件时,当它试图从MyApp.Database.dll调用该方法时,它告诉我“无法加载文件或程序集”MyApp.Database、Version=3.3.3.11658、Culture=neutral、PublicKeyToken=…”或其依赖项之一。'

MyApp.Database.dll没有在GAC中注册(为了避免这种情况,其他应用程序也使用它),并且没有使用regasm在注册表中注册它的代码库(我尝试了这个,但仍然没有工作)。版本是正确的,我已将MyApp.Database.dll放在COM+组件的应用程序文件夹中

我是否遗漏了什么,或者不可能这样做


提前感谢您的帮助。

这是一个常见的错误期望:仅仅因为在某个给定文件夹(由/codebase参数或RegAsm设置的文件夹)中找到了.NET COM DLL,并不意味着.NET会在该文件夹中查找任何其他内容

一般来说,不会。通过COM互操作加载.NET程序集是一种特殊情况。对于其他内容,程序集将根据进程的融合绑定策略加载到AppDomain中,这与.NET COM DLL的位置无关。该进程实际上是(取决于您的IIS版本)dllhost.exe、iisexpress.exe或w3wp.exe

你有几个选择

首先,显而易见的解决方案是将MyApp.Database.dll放在GAC中,因为.NET总是在那里查找。有时候,这是正确的选择(我已经做到了,而且效果很好)。你拒绝这样做,你有你的理由;没关系

其次,我相信您可以使用web.config文件更改绑定策略。请参见此处:。是的,您的ASP Classic项目可以有一个web.config。显然,它对ASP经典脚本没有影响,但是(取决于IIS的版本),.NET和/或IIS本身使用它进行配置。恐怕我不能帮你很多,因为我以前从来没有尝试过,但欢迎你探索这个选择-让我知道它是如何进行的

第三种选择——我个人的选择:你说这个DLL已经是一个web服务了,对吗?只需从COM DLL通过web服务调用调用该功能。这不需要处理魔法文件夹、GAC和绑定策略。干净多了。唯一稍微复杂的是在配置中跟踪web服务所在的位置——我敢打赌您已经为数据库连接这样做了,所以添加它应该不难

如果您想知道.NET在哪里查找DLL,请阅读以下内容:


祝你好运,请让我们知道什么对你有用。

谢谢你的反馈。无法执行第三个选项,因为WS不在该DLL中。WS位于调用MyApp.Database.DLL中方法的另一个DLL中。如果可能,还希望避免在同一web应用程序中使用来自ASP的WS。事实上,以前,要插入SQL数据库的所有代码都在web服务DLL中,但将其移出到其他类可以调用的更独立的DLL中,因此保留了修改插入代码的中心位置,插入代码可能会定期更改。因此,我将其移动到MyApp.database.dll中,但COM+无法引用它。为了进一步澄清,正如您所说,ASP是在w3wp.exe进程下运行的。用户使用域身份验证登录到IIS,因此这意味着经典ASP作为登录用户运行。此VB ASP执行“设置oDocRepo=Server.CreateObject(“CRepository.DocRepository”)”,然后从该对象调用该方法。这意味着COM+正在作为COM+应用程序属性下的指定用户运行,正如我在组件服务中指定的那样。因此,此COM+应用程序在w3wp.exe下运行。MyApp.Database.dll也位于网站应用程序的\bin文件夹下,但未找到…@DomG,您是否有机会尝试第二种选择(web.config中的绑定策略)?没有尝试绑定,因为这似乎超出了我的预期,并且证明是真的。您关于使用Fusion日志记录的建议帮助解决了这个问题。我在下一篇评论中的发现是:我的COM+组件是一个.NET程序集。这意味着当我使用“Server.CreateObject”从我的网站classic ASP创建它时,COM+实际上不是在w3wp.exe下运行,而是在system32\dllhost.exe下运行。这是因为Fusion是一个.NET程序集,它会在GAC中找到它。因此,当我在COM+.NET代码(即“MyApp.Database.RepositoryApi repoApi=new MyApp.Database.RepositoryApi();”)中引用MyApp.Database.dll时,它在GAC中找不到它,忽略注册表中的代码库(它是.NET),并在执行文件夹C:\Windows\System32\中查找。