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

时间:2014-05-27 08:40:28

标签: dll com gac com+ dllregistration

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

还有一个Web服务在网站应用程序中使用\ bin DLL,其中包含将一些数据插入SQL Server数据库的方法(我们称之为 MyApp.Database.dll )。 / p>

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

出于显而易见的原因,我不想在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中注册(试图避免这种情况,它也被其他应用程序使用),并且没有在注册表中注册其代码库< strong> regasm (我试过这个但仍然没有用)。版本是正确的,我已将 MyApp.Database.dll 放在COM +组件的应用程序文件夹中。

我错过了什么或者不可能这样做吗?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这是一个常见的错误预期:仅仅因为在某个给定文件夹(由/ codebase参数或RegAsm设置的文件夹)中找到了.NET COM DLL - 这并不意味着.NET将在该文件夹中查找别的什么。

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

您有几个选择。

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

其次,我相信您可以使用web.config文件更改绑定策略。见这里:http://msdn.microsoft.com/en-us/library/823z9h8w(v=vs.110).aspx。是的,您的ASP Classic项目可以有一个web.config。显然它对你的ASP Classic脚本没有影响,但是(取决于IIS的版本),.NET和/或IIS本身使用它来进行配置。我担心我对这个替代方案帮助不大,因为我以前从未尝试过,但是欢迎你去探索这个选项 - 让我知道它是怎么回事。

第三个选项 - 我的个人选择:你说这个DLL已经是一个Web服务了,对吧?只需通过COM DLL中的Web服务调用来调用该功能。这不需要使用魔术文件夹,GAC和绑定策略。更清洁。唯一的轻微复杂因素是跟踪您的Web服务所在的配置 - 我打赌您已经为数据库连接做了这些,所以它应该不难添加。

如果您想知道.NET在哪里寻找DLL,请阅读这些人:

祝你好运,请告诉我们什么对你有用。